以下代码试图让我更好地理解[NSURLConnection sendAsynchronousRequest:queue:completionHandler]
。
NSLog
块中有completionHandler
个语句,但是当我在命令行项目的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;
}
答案 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
有一个运行循环,运行循环仍在循环。因此,事情仍然存在,所以现在异步材料可能发生 - 我们可以联网,然后调用回调。