Ios 异步请求未进入完成块

Ios 异步请求未进入完成块,ios,objective-c,arrays,asynchronous,Ios,Objective C,Arrays,Asynchronous,下面的代码试图让我更好地理解[NSURLConnection sendAsynchronousRequest:queue:completionHandler] 在completionHandler块中有NSLog语句,但是当我从命令行项目在XCode的main.m中运行它时,它从不进入completionHandler块。我尝试过使用不同的队列,mainQueue和currentQueue,但都不起作用 我的直觉是,队列在请求完成之前就被释放了,这涉及到保留周期 #import <Foun

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

completionHandler
块中有
NSLog
语句,但是当我从命令行项目在XCode的
main.m
中运行它时,它从不进入
completionHandler
块。我尝试过使用不同的队列,
mainQueue
currentQueue
,但都不起作用

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

#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"];

        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;
}
#导入
int main(int argc,const char*argv[]{
@自动释放池{
NSCache*myCache=[[NSCache alloc]init];
NSArray*图像=@[
@"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*图像){
NSURL*myURL=[NSURL-URLWithString:image];
NSURLRequest*request=[[NSURLRequest alloc]initWithURL:myURL];
NSLog(@“可以处理请求%@”,@([NSURLConnection CanHandlerRequest:request]);
NSOperationQueue*队列=[[NSOperationQueue alloc]init];
[NSURLConnection sendAsynchronousRequest:请求
队列:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse*响应,NSData*数据,NSError*错误){
NSLog(@“在完成处理程序中”);
如果(!错误)
{
//使用url作为键将数据保存到缓存
NSLog(@“图像已添加到缓存”);
[myCache setObject:数据
forKey:myURL];
}否则
{
NSLog(@“未将映像添加到缓存”);
}
}];
}
}
返回0;
}
我的直觉是,队列在请求完成之前就被释放了,这涉及到保留周期

不完全是。不涉及保留周期。这涉及到持久性。您在
主功能中执行此操作。它会立即退出——异步的东西(网络和随后的回调)是异步的,所以如果我们有持久性的话,它会在以后出现。但我们没有
main
退出,这意味着整个该死的程序在有机会进行任何联网之前就被拆掉了,kaboom,更不用说在联网后调用完成处理程序了

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

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil,
            NSStringFromClass([AppDelegate class]));
    }
}
在该代码中,
UIApplicationMain
会一直运行,直到中止或以其他方式终止。与此同时,类和实例已经开始活跃起来,并且它们一直存在,因为
UIApplicationMain
并没有停止。例如:

@implementation MyViewController
- (void) someMethod {
    // ...
    [NSURLConnection sendAsynchronousRequest:request
         queue:[NSOperationQueue mainQueue]
         completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
             // ...
    }
}
@end
现在,在某种意义上,完全相同的事情发生了:
someMethod
立即退出。但是我们的程序仍然在运行
UIApplicationMain
有一个运行循环,该运行循环仍在循环。因此,事情继续存在,所以现在异步材料可以发生——我们可以建立网络,然后调用回调

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

不完全是。不涉及保留周期。这涉及到持久性。您在
主功能中执行此操作。它会立即退出——异步的东西(网络和随后的回调)是异步的,所以如果我们有持久性的话,它会在以后出现。但我们没有
main
退出,这意味着整个该死的程序在有机会进行任何联网之前就被拆掉了,kaboom,更不用说在联网后调用完成处理程序了

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

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil,
            NSStringFromClass([AppDelegate class]));
    }
}
在该代码中,
UIApplicationMain
会一直运行,直到中止或以其他方式终止。与此同时,类和实例已经开始活跃起来,并且它们一直存在,因为
UIApplicationMain
并没有停止。例如:

@implementation MyViewController
- (void) someMethod {
    // ...
    [NSURLConnection sendAsynchronousRequest:request
         queue:[NSOperationQueue mainQueue]
         completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
             // ...
    }
}
@end
现在,在某种意义上,完全相同的事情发生了:
someMethod
立即退出。但是我们的程序仍然在运行
UIApplicationMain
有一个运行循环,该运行循环仍在循环。因此,事情继续存在,所以现在异步材料可以发生——我们可以建立网络,然后调用回调

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

不完全是。不涉及保留周期。这涉及到持久性。您在
主功能中执行此操作。它会立即退出——异步的东西(网络和随后的回调)是异步的,所以如果我们有持久性的话,它会在以后出现。但我们没有
main
退出,这意味着整个该死的