未调用NSURLSession完成块

esh*_*esh 17 macos nsurlsession ios8

var session = NSURLSession.sharedSession()
session.dataTaskWithRequest(urlRequest, 
                            completionHandler: {(data: NSData!, 
                                                 response: NSURLResponse!,                       
                                                 error: NSError!) in
                                                      println(data)
                                                      println(response)
                                                      println(error)
                                               })
Run Code Online (Sandbox Code Playgroud)

所以我正在发出这个请求,永远不会调用完成块.

怎么了?

此外,我尝试了synchronous and asynchronous form同样的请求,NSURLConnection它工作得很好.

编辑:

我尝试将dataTask变量分配给session.dataTaskWithRequest并在之后显示.它说这个<__NSCFLocalDataTask: 0xb41bda0> { suspended }暂停?为什么?

esh*_*esh 53

所以我试着这样称呼它

session.dataTaskWithRequest(urlRequest, 
                        completionHandler: {(data: NSData!, 
                                             response: NSURLResponse!,                       
                                             error: NSError!) in
                                                  print(data)
                                                  print(response)
                                                  print(error)
                                           }).resume()
Run Code Online (Sandbox Code Playgroud)

它奏效了.

好像我必须调用resume()默认的暂停会话任务.

  • 是.这在Swift或Objective C中是相同的; 所有NSURLSession任务都以挂起状态启动,必须​​"恢复"以启动它们.这是基于Objective C的,但是[来自raywenderlich.com的这个NSURLSession教程](http://www.raywenderlich.com/51127/nsurlsession-tutorial)是我遇到的NSURLSession代码的最佳非Apple示例,所以仔细查看可能会帮助您找出最佳使用方法. (9认同)

小智 7

你在玩游乐场吗?

如果你是,你应该小心包括:

 XCPSetExecutionShouldContinueIndefinitely(continueIndefinitely: true)
Run Code Online (Sandbox Code Playgroud)

为了让操场等待回调


Ram*_*hna 5

我面临同样的问题,我通过以下方式解决了它

NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * data, NSURLResponse * response, NSError * error) {

    if (!error)
    {
        NSLog(@"Data is %@",data);
        NSLog(@"Response is %@",response);
        NSLog(@"Error is %@",error);
    }
 }];

[dataTask resume];
Run Code Online (Sandbox Code Playgroud)

并检查您是否已添加到App Transport Security Settings您的info.plist.