异步请求不会进入完成块

时间:2015-06-14 03:25:50

标签: ios objective-c arrays asynchronous

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

NSLog块中有completionHandler个语句,但是当我在命令行项目的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://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;
}

1 个答案:

答案 0 :(得分:3)

  

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

不完全。不涉及保留周期。涉及持久性。您是在dplyr函数中执行此操作。它立即退出 - 异步内容(网络和后续回调)是异步的,所以它会在以后发生,如果我们有任何持久性。但我们不是。 ## Some data set.seed(0) dat <- data.frame(Group=factor(rep(1:2, 100)), X=rnorm(100), Y=rnorm(100)) ## A random function to apply to groups ## returns data.frame with same number of columns as length of x and y func <- function(x, y) as.data.frame(t( (x+y)/2 )) library(plyr) res <- ddply(dat, .(Group), function(x) { func(x$X, x$Y) }) res # Group V1 V2 V3 V4 V5 V6 # 1 1 1.022407 0.3569047 -0.3578722 -1.1046582 -0.2532319 0.1755368 # 2 2 -0.551505 0.6595048 -0.4816156 0.6653634 2.0414753 -0.8856480 # ... ## With `do` from dplyr library(dplyr) dat %>% group_by(Group) %>% do(func(.$X, .$Y)) 退出,这意味着整个darned程序被拆除, kaboom ,然后才有机会进行任何联网,更不用说回电话了网络化后的完成处理程序。

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

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 有一个运行循环,运行循环仍在循环。因此,事情仍然存在,所以现在异步材料可能发生 - 我们可以联网,然后调用回调。