URLSessionDataDelegate代理方法调用顺序是否有明确规定?
URLSessionDataDelegate代理方法的调用顺序是否固定?
我在SwiftUI中使用以下自定义MyURL类作为所有URL相关操作的代理,该类运行正常。但想确认这些代理方法的调用是否有明确的顺序?didReceive response方法是否一定会在didReceive data方法之前触发,还是顺序可能相反?
class MyURL: NSObject, ObservableObject, URLSessionDataDelegate,URLSessionTaskDelegate, URLSessionDelegate, URLSessionDownloadDelegate{ // Error received func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { if let err = error { DispatchQueue.main.async { [self] in errMsg = err.localizedDescription } } } // Response received func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: (URLSession.ResponseDisposition) -> Void) { completionHandler(URLSession.ResponseDisposition.allow) if let httpResponse = response as? HTTPURLResponse { xFile?.httpResponse = httpResponse.statusCode if httpResponse.statusCode == 200 { } } } // Data received func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) { if xFile?.httpResponse == 200 { do { // run JSON decoder here on received data } } func delayText() async { try? await Task.sleep(nanoseconds: 5000000000) DispatchQueue.main.async { self.errMsg = "done" } } func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { } }
我可以通过调试器查看当前的调用顺序,但不确定该顺序是否始终保持一致。
答案
对于URLSessionDataTask的代理方法,调用顺序是Apple官方明确规定的固定行为,不会随意变动:
- 首先触发
urlSession(_:dataTask:didReceive:completionHandler:)(即你代码中的"Response received"方法):这是服务器返回响应头后第一个触发的代理方法,你必须通过调用completionHandler来决定是否允许接收后续数据。 - 只有当你在
completionHandler中传入.allow后,才会开始接收响应体数据,之后urlSession(_:dataTask:didReceive:)("Data received"方法)会被触发,而且这个方法可能被多次调用(因为网络数据通常是分块传输的)。 - 最后,无论请求成功还是失败,都会触发
urlSession(_:task:didCompleteWithError:)方法来标记任务完成。
简单来说,didReceive response一定会在didReceive data之前触发,你可以放心依赖这个顺序来处理业务逻辑(比如先在response方法中校验状态码,再在data方法中解析数据)。
内容的提问来源于stack exchange,提问作者NewToSwiftUI
相关产品推荐
相关产品推荐

