NSURLSessionTask。暂停不起作用
NSURLSessionTask. Suspend does not work
这是 Apple 文档中关于 NSURLSessionTask
suspend
方法的说明 class
A task, while suspended, produces no network traffic and is not subject to timeouts.
好的。所以我运行下面的简单代码:
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 的更明确的文档将有助于阐明我们所看到的内容。
Apple 的文档没有提供有关挂起如何工作或何时使用的详细说明。但是,我的观点(基于测试和研究)是 suspend()
应该只用于下载
任务。数据任务应仅在适当时使用 resume()
(启动任务)和 cancel()
。
我使用 Xcode 和 Charles Proxy 进行的测试表明,暂停的数据任务对网络流量没有影响,如 Apple 文档中所述。也就是说,产生了网络流量。
我使用挂起和数据任务观察到两件事:
1)resume后立即调用,对数据任务没有影响。它不会暂停网络流量,除非没有网络或服务器端问题,否则会在回调中收到成功的响应。
2) 如果在dispatch.asyncAfter
回调中调用它,它仍然不会暂停网络流量,但是回调会收到“请求超时”错误而不是成功响应。根据 Charles Proxy 的说法,请求是成功的。正是这个结果让我相信 suspend()
不应该用于数据任务。这个回调的结果在我看来基本没用。
正在取消数据任务:
cancel()
按预期工作。客户端(您)在从服务器获得完整响应之前关闭连接。这可以在调用 resume()
之后立即完成,也可以稍后(当然是在请求完成之前)完成。
我接受 suspend() 对 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()
您可以使用 URLRequest 调用 dataTask 并将 timeoutInterval 设置为 .infinity。 (默认为 60 秒)
var request = URLRequest(url: url)
request.timeoutInterval = .infinity
task = session.dataTask(with: request)
task?.resume()
这是 Apple 文档中关于 NSURLSessionTask
suspend
方法的说明 class
A task, while suspended, produces no network traffic and is not subject to timeouts.
好的。所以我运行下面的简单代码:
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 的更明确的文档将有助于阐明我们所看到的内容。
Apple 的文档没有提供有关挂起如何工作或何时使用的详细说明。但是,我的观点(基于测试和研究)是 suspend()
应该只用于下载
任务。数据任务应仅在适当时使用 resume()
(启动任务)和 cancel()
。
我使用 Xcode 和 Charles Proxy 进行的测试表明,暂停的数据任务对网络流量没有影响,如 Apple 文档中所述。也就是说,产生了网络流量。
我使用挂起和数据任务观察到两件事:
1)resume后立即调用,对数据任务没有影响。它不会暂停网络流量,除非没有网络或服务器端问题,否则会在回调中收到成功的响应。
2) 如果在dispatch.asyncAfter
回调中调用它,它仍然不会暂停网络流量,但是回调会收到“请求超时”错误而不是成功响应。根据 Charles Proxy 的说法,请求是成功的。正是这个结果让我相信 suspend()
不应该用于数据任务。这个回调的结果在我看来基本没用。
正在取消数据任务:
cancel()
按预期工作。客户端(您)在从服务器获得完整响应之前关闭连接。这可以在调用 resume()
之后立即完成,也可以稍后(当然是在请求完成之前)完成。
我接受 suspend() 对 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()
您可以使用 URLRequest 调用 dataTask 并将 timeoutInterval 设置为 .infinity。 (默认为 60 秒)
var request = URLRequest(url: url)
request.timeoutInterval = .infinity
task = session.dataTask(with: request)
task?.resume()