我想确保以正确的方式实现 URLSessionTaskDelegate 和 URLSessionDataDelegate。我使用它们,因为我希望能够跟踪进度。这是到目前为止的代码:
final public fileprivate(set) var data: Data?
final public fileprivate(set) var response: URLResponse?
final public fileprivate(set) var error: Error?
public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) {
if let response = response as? HTTPURLResponse, response.statusCode == 200 {
data = Data()
}
self.response = response
completionHandler(.allow)
}
public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
self.data?.append(data)
}
public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
self.error = error
// ... Work with downloaded data
}
和几个问题:
- 我应该总是在 didReceive 响应中执行 completionHandler,它应该总是 .allow 吗?也许我应该只在响应状态代码为 200 时才这样做?
- 在这种情况下,状态码 200 是我唯一需要真正检查的吗?这是初始化数据的正确位置吗?也许这个函数可以用不同的代码执行几次,我应该区别对待任何代码?
- didCompleteWithError 是我唯一需要分配错误的地方吗?也许错误也可以在不同的地方产生?
- 在 URLResponse 的文档中,我可以看到 expectedContentLength 的默认值为 NSURLResponseUnknownLength,但该值不存在。现在有什么新名字吗?
- 还有什么我应该知道的,以便这个代码是通用的吗?