NSURLSessionDataTask dataTaskWithURL完成处理程序未被调用

我最近一直在学习Objective C,我决定尝试连接。

NSURLConnection的一切都很棒,直到我发现它已经过时,并尝试使用NSURLSession。

我正在尝试一个非常简单的示例,但似乎无法让我的应用程序在完成块内运行代码。

这是使用的代码:

NSURL * url = [NSURL URLWithString:@"http://api.openweathermap.org/data/2.5/weather?q=London,uk"]; NSLog(@"2"); NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration]; NSLog(@"3"); NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]]; NSLog(@"4"); NSURLSessionDataTask * dataTask = [defaultSession dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"11"); if(error == nil) { NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; NSLog(@"Data = %@",text); } NSLog(@"22"); }); }]; NSLog(@"5"); [dataTask resume]; NSLog(@"6"); 

我从主执行中获取了所有打印的数字,但是从未执行completionHandler。 我也尝试使用代表,没有成功。

提前致谢。

编辑按照建议,我已将我的function更改为以下内容:

 -(void) doGET{ NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject]; NSURLSessionDataTask * dataTask = [defaultSession dataTaskWithURL:[self url] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSLog(@"11"); if(error == nil) { NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; NSLog(@"Data = %@",text); } NSLog(@"22"); }]; [dataTask resume]; } 

我的完成经理仍然没有运行。 我也尝试使用sharedSession而不是传递配置但也没有运气。

谢谢您的帮助

如果您要使用数据任务的完成块再现,而不是指定nildelegate ,如下所示:

 NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]]; 

您应该使用不接受delegate的方法来实例化您的会话:

 NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject]; 

或者,假设您根本没有自定义配置,则可以完全跳过NSURLSessionConfiguration的实例化并使用共享的NSURLSession

 NSURLSession *defaultSession = [NSURLSession sharedSession]; 

但是,最重要的是,除非您要实现委托,否则不应使用sessionWithConfiguration:delegate:queue: rendition,在这种情况下,您不会使用completionHandler参数来NSURLSessionDataTask方法。

此外,请确保您的设备/模拟器运行的是iOS 7.0或更高版本。

检查代码的位置。

尽管在代码所在的OP 没有说明,但经过多次查看和多次迭代后,我发现将样本代码放在-viewDidLoad从未执行完成处理程序。 将代码移入

 - (void)viewWillAppear:(BOOL)animated { } 

解决了永不完成的任务问题。 (我仍然不明白为什么。)

Interesting Posts