【问题标题】:Correct handling session delegates正确处理会话代表
【发布时间】:2016-11-12 07:35:38
【问题描述】:

我想确保以正确的方式实现 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
}

还有几个问题:

  1. 我应该总是在 didReceive 响应中执行 completionHandler,它应该总是 .allow 吗?也许我应该只在响应状态码为 200 时才这样做?
  2. 在这种情况下,我需要真正检查的唯一状态代码是 200 吗?这是初始化数据的正确位置吗?也许这个函数可以用不同的代码执行几次,我应该区别对待任何代码?
  3. didCompleteWithError 是我唯一需要分配错误的地方吗?也许错误也会在不同的地方产生?
  4. 在 URLResponse 的文档中,我可以看到 expectedContentLength 的默认值为 NSURLResponseUnknownLength,但该值不存在。现在有什么新名字吗?
  5. 还有什么我应该知道的以使此代码具有通用性吗?

【问题讨论】:

    标签: swift delegates urlsession


    【解决方案1】:
    1. 如果 status code 不是 200,则响应正文通常包含有助于诊断为什么它不是 200 的信息,因此您可能希望继续捕获该信息。我可能会将该状态代码检查移至didCompleteWithError

    2. 我通常期望 200,因此只检查 200。从技术上讲,所有 2xx 代码都是“成功”代码,因此您可能希望将它们都视为成功。这取决于你。

    3. didCompleteWithError 是唯一与连接相关的错误。从理论上讲,您可能需要检查urlSession(_:didBecomeInvalidWithError:)。此外,如果您获得非 2xx 状态代码,或者更高级别的响应解析失败,您可能需要分配自己的错误代码。

    4. 他们似乎没有从 Swift 3 定义适当的常量。仅供参考,查看标题,您可以看到值是 -1,但我们通常只检查 response.expectedContentLength < 0

    【讨论】:

    • 感谢您的解释。所以我将始终在 didReceive 响应中创建 data = Data() 并在 didCompleteWithError 之后检查状态代码。
    猜你喜欢
    • 2012-07-18
    • 2013-10-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2013-02-10
    相关资源
    最近更新 更多