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
退出,这意味着整个该死的