gpt4 book ai didi

swift - 正确处理 session 委托(delegate)

转载 作者:搜寻专家 更新时间:2023-10-31 22:58:38 25 4
gpt4 key购买 nike

我想确保以正确的方式实现 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. 还有什么我应该知道的才能让这个代码通用吗?

最佳答案

  1. 如果status code不是 200,通常响应的正文包含帮助您诊断为什么不是 200 的信息,因此您可能希望继续捕获该信息。我可能会将该状态代码检查移动到 didCompleteWithError .

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

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

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

关于swift - 正确处理 session 委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40560663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com