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

时间:2014-03-24 12:30:40

标签: ios objective-c nsurlsession

我最近一直在学习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。我也尝试使用代表,但没有成功。

提前致谢。

修改 的 正如所建议的,我已将我的功能更改为以下内容:

-(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而不是传递配置,但也没有运气。

感谢您的帮助

2 个答案:

答案 0 :(得分:5)

如果您打算使用数据任务的完成块再现,而不是指定delegate nil,请执行以下操作:

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:再现,在这种情况下,您不会使用NSURLSessionDataTask方法的completionHandler方法的再现{1}}参数。

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

答案 1 :(得分:0)

检查代码的位置。

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

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

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