这是苹果文档中关于suspend类NSURLSessionTask方法的说明
任务虽然挂起,但不会产生网络流量,也不受超时的影响。
好的。因此,我运行以下简单代码:
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秒内,使用超时错误调用完成块。有人能解释一下怎么回事吗?
发布于 2016-11-17 19:36:28
这似乎是正常的行为,不过苹果提供的更明确的文档将有助于澄清我们所看到的东西。
苹果的文档并没有详细解释挂起是如何工作的,以及何时使用。然而,--我的观点是,(基于测试和研究)认为,suspend()只应该用于下载任务。数据任务应该只在适当时使用resume() (启动任务)和cancel()。
我使用Xcode和Charles进行的测试显示,一个挂起的数据任务对网络流量没有影响,如苹果的文档所示。换句话说,网络流量是产生的。
使用挂起和数据任务观察到了两种情况:
1)如果在恢复后立即调用它,则对数据任务没有任何影响。它不挂起网络流量,除非出现网络或服务器端问题,回调中将收到成功的响应。
2)如果在dispatch.asyncAfter回调中调用它,它仍然不会挂起网络流量,但是回调将得到一个“请求超时”错误,而不是一个成功的响应。但根据Charles Proxy的说法,请求是成功的。正是这个结果使我相信suspend()不应该用于数据任务。在我看来,这次回调的结果基本上是无用的。
取消数据任务:
cancel()按预期工作。客户端(您)在从服务器获得完整响应之前关闭连接。这可以在调用resume()之后或稍后时间(当然,在请求完成之前)完成。
发布于 2017-02-17 10:47:22
我接受挂起()对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()发布于 2022-04-11 06:09:44
您可以使用URLRequest调用timeoutInterval,并将timeoutInterval设置为.infinity。(缺省值为60)
var request = URLRequest(url: url)
request.timeoutInterval = .infinity
task = session.dataTask(with: request)
task?.resume()https://stackoverflow.com/questions/40662007
复制相似问题