NSURLSessionTask。暂停不起作用
这是苹果的文件说,关于NSURLSessionTask
类NSURLSessionTask。暂停不起作用
任务的
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秒内,完成程序段被调用并发生超时错误。任何人都可以解释什么是错的?
这似乎是正常的行为,但是苹果的更多权威性文档将有助于澄清我们所看到的内容。
Apple的文档没有提供关于暂停如何工作或应何时使用的详细说明。但是,我的观点(基于测试和研究)是suspend()
应该只用于下载 任务。数据任务只能在适当时使用resume()
(启动任务)和cancel()
。
我的测试,使用Xcode和Charles Proxy,显示暂停的数据任务对网络流量没有影响,如Apple的文档中所示。换句话说,网络流量产生了。
我观察到的暂停使用和数据的任务,两件事情:
1)如果这就是所谓的简历之后,它对数据的任务没有影响。它不会暂停网络流量,也不会限制网络或服务器端的问题,在回调中收到成功的响应。
2)如果这就是所谓的dispatch.asyncAfter
回调,但仍然没有暂停的网络流量,但是回调得到一个“请求超时”的错误,而不是成功的响应。根据查尔斯代理,请求是成功的,但。正是由于这个结果,我认为suspend()
不应该与数据任务一起使用。我认为这种回调的结果基本上是无用的。
取消数据任务:
cancel()
按预期工作。客户端(您)在从服务器获得完整响应之前关闭连接。这可以在调用resume()
之后或稍后(在请求完成之前)完成。
“请求超时。”?那是什么?传入完成块的错误?所以它适用于你,就像我一样,因此对于暂停的任务来说这是正常的行为,对吧?如果是,那为什么我们需要暂停?还是我误解了一些东西? –
@AndreyChernukha对不起,我似乎误解了你的问题。我以为你没有看到控制台中的“暂停”消息。 –
@AndreyChernukha你是对的,我已经更新了我的答案以提供更多细节。数据任务似乎是正常行为。下载任务可能不会传递到完成块,直到任务恢复并完成。 –
我同意暂停()对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()
能带你逛逛'dispatch_after'包装? –