2014-03-24 51 views
7

我最近一直在学习Objective C,并且我决定尝试连接。NSURLSessionDataTask dataTaskWithURL完成处理程序没有被调用

一切都很好,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,而不是传递配置,但没有运气。

感谢您的帮助

+0

你有没有得到这段代码的工作?我的代码几乎是相同的(我想我们访问了相同的网站),我也无法获得完成代码块被调用。但是,我使用iOS模拟器7.1作为单元测试运行我的代码,我想知道这是否会产生任何影响。我还修改了NSURLSession,没有任何帮助。我注意到你把问题标记为已回答,但仍不清楚答案是什么? –

回答

5

如果你要使用的数据任务的完成移交块,而不是指定的nil一个delegate,像这样:

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

而应该实例,

NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject]; 

,或者因为你”:使用该方法您的会话不采取delegate在所有再没有自定义配置的所有,你可以完全跳过NSURLSessionConfiguration的实例化和使用共享NSURLSession

NSURLSession *defaultSession = [NSURLSession sharedSession]; 

但是,底线,你不应该使用sessionWithConfiguration:delegate:queue:再现,除非你打算实施代表,在这种情况下,您将不会使用NSURLSessionDataTask方法与completionHandler参数的再现。

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

+0

我试图用各种不同的方法做到这一点:使用自定义委托,您给出的建议和我上面发布的建议。问题是我没有从完成处理程序(或使用它时的委托)中获取NSLog操作。我的代码有点混淆了我所采用的所有方法,所以它可能不是最好的,但我无法得到代理或完成处理程序来打印任何内容。我不确定为什么我读过的所有内容都表明它应该。你知道是否有任何其他原因它不会'执行'完成hander吗?在此先感谢 – ylc

+0

我已经编辑了与您的建议,但即使使用新功能我没有反应completionHandler – ylc

+0

@ user3214816是你在iOS 7上运行这个?如果你在iOS 6.1上运行,你不会得到一个异常(我很惊讶),但'defaultSession'和'dataTask'一样是'nil'。除此之外,我不知道为什么它不起作用,因为您的代码可以在我的iOS 7.x设备和iOS 7.x模拟器上正常工作。我建议记录'defaultSession'和'dataTask',看看你是否得到有效的对象。 – Rob

0

检查您的代码的位置。

虽然它不是在OP 其中代码位于说,我发现,经过多次寻找,并多次迭代,这将示例代码中-viewDidLoad从来没有执行完成处理。移动代码到

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

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

相关问题