2016-11-17 84 views
5

这是苹果的文件说,关于NSURLSessionTaskNSURLSessionTask。暂停不起作用

任务的suspend方法,而暂停,不产生任何网络流量和不受超时。

好的。所以我运行下面简单的代码:

 let url = NSURL(string: "http://httpbin.org/delay/10")! 
     let urlRequest = NSURLRequest(URL: url) 

     self.task = NSURLSession.sharedSession().dataTaskWithURL(urlRequest.URL!, completionHandler: { 

      data, response, error in print("completion ERROR \(error)") 
     }) 

     self.task.resume() 

     print("Start") 
     delay(5, closure: { 

      self.task.suspend() 

      print("Suspend") 
     }) 

功能delay它仅仅是dispatch_after的包装和http://httpbin.org/delay/10请求给予10秒后响应。在等待回应的过程中,我暂停了任务。然而,这不起作用。在60秒内,完成程序段被调用并发生超时错误。任何人都可以解释什么是错的?

+0

能带你逛逛'dispatch_after'包装? –

回答

5

这似乎是正常的行为,但是苹果的更多权威性文档将有助于澄清我们所看到的内容。

Apple的文档没有提供关于暂停如何工作或应何时使用的详细说明。但是,我的观点(基于测试和研究)是suspend()应该只用于下载 任务。数据任务只能在适当时使用resume()(启动任务)和cancel()

我的测试,使用Xcode和Charles Proxy,显示暂停的数据任务对网络流量没有影响,如Apple的文档中所示。换句话说,网络流量产生了。

我观察到的暂停使用和数据的任务,两件事情:

1)如果这就是所谓的简历之后,它对数据的任务没有影响。它不会暂停网络流量,也不会限制网络或服务器端的问题,在回调中收到成功的响应。

2)如果这就是所谓的dispatch.asyncAfter回调,但仍然没有暂停的网络流量,但是回调得到一个“请求超时”的错误,而不是成功的响应。根据查尔斯代理,请求是成功的,但。正是由于这个结果,我认为suspend()不应该与数据任务一起使用。我认为这种回调的结果基本上是无用的。

取消数据任务:

cancel()按预期工作。客户端(您)在从服务器获得完整响应之前关闭连接。这可以在调用resume()之后或稍后(在请求完成之前)完成。

+0

“请求超时。”?那是什么?传入完成块的错误?所以它适用于你,就像我一样,因此对于暂停的任务来说这是正常的行为,对吧?如果是,那为什么我们需要暂停?还是我误解了一些东西? –

+0

@AndreyChernukha对不起,我似乎误解了你的问题。我以为你没有看到控制台中的“暂停”消息。 –

+0

@AndreyChernukha你是对的,我已经更新了我的答案以提供更多细节。数据任务似乎是正常行为。下载任务可能不会传递到完成块,直到任务恢复并完成。 –

0

我同意暂停()对URLSessionDataTask

    let dataTask = URLSession.shared.dataTask(with: request) { (data, urlResponse, error) in       
        print("response is received all the time") 
        } 
       } 
       dataTask.resume() 
       dataTask.suspend() 

没有效果然而,当我试着取消它

let dataTask = URLSession.shared.dataTask(with: request) { (data, urlResponse, error) in       
        print("response is cancelled") 
        } 
       } 
       dataTask.resume() 
       dataTask.cancel()