ios - Async request does not enter completion block -
the following code attempt me better understand [nsurlconnection sendasynchronousrequest:queue:completionhandler].
there nslog statements in completionhandler block, when run in main.m in xcode command line project, never enters completionhandler blocks. i've tried using different queues, mainqueue , currentqueue neither work.
my hunch queue being deallocated before request completed , retain cycles involved.
#import <foundation/foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { nscache *mycache = [[nscache alloc] init]; nsarray *images = @[ @"http://i.stack.imgur.com/e66qr.png", @"http://www.tiempoyquimera.com/wp-content/uploads/2010/01/euro-trash-girl-2010.jpg", @"http://1.bp.blogspot.com/-mxd8ab2nbqy/uycisjiqz3i/aaaaaaaaah8/tc43u8aa9dm/s1600/tarantino10colhans_1460858i.jpg", @"https://awestruckwanderer.files.wordpress.com/2014/02/alan-watts.png", @"http://www.esalen.org/sites/default/files/photo_images/20120201_dellis__mg_9612_711.jpg"]; (nsstring *image in images){ nsurl *myurl = [nsurl urlwithstring:image]; nsurlrequest *request = [[nsurlrequest alloc] initwithurl:myurl]; nslog(@"can handle request %@", @([nsurlconnection canhandlerequest:request])); nsoperationqueue *queue = [[nsoperationqueue alloc]init]; [nsurlconnection sendasynchronousrequest:request queue:[nsoperationqueue mainqueue] completionhandler:^(nsurlresponse *response, nsdata *data, nserror *error) { nslog(@"in completion handler"); if (!error) { // save data cache url key nslog(@"image added cache"); [mycache setobject:data forkey:myurl]; } else { nslog(@"image not added cache"); } }]; } } return 0; }
my hunch queue being deallocated before request completed , retain cycles involved
not quite. retain cycles not involved. persistence involved. doing in main function. exits immediately - asynchronous stuff (the networking , subsequent callback) asynchronous, come later, if had persistence. don't. main exits, , means whole darned program torn down, kaboom, before there opportunity networking, let alone call completion handler after networking.
now contrast how things happen in real life. in real ios app, main not exit, because calls uiapplicationmain, loops until app terminated.
int main(int argc, char *argv[]) { @autoreleasepool { return uiapplicationmain(argc, argv, nil, nsstringfromclass([appdelegate class])); } } in code, uiapplicationmain keeps running until aborted or otherwise terminated. meanwhile, classes , instance have sprung life, , persist, because uiapplicationmain not stop. example:
@implementation myviewcontroller - (void) somemethod { // ... [nsurlconnection sendasynchronousrequest:request queue:[nsoperationqueue mainqueue] completionhandler:^(nsurlresponse *response, nsdata *data, nserror *error) { // ... } } @end now, in 1 sense, same thing happens: somemethod exits immediately. our program overall still running! uiapplicationmain has run loop , run loop still cycling. thus, things live on, , asynchronous material can happen - can network , call callback.
Comments
Post a Comment