NSURLSessionTask。暂停不起作用

时间:2016-11-17 18:05:30

标签: ios swift nsurlsession nsurlsessiondatatask

这就是Apple的文档中关于suspend类的NSURLSessionTask方法的说法

  

任务暂停时不会产生网络流量,也不会超时。

确定。所以我运行以下简单代码:

        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秒内,将调用完成块并显示超时错误。任何人都可以解释一下有什么问题吗?

2 个答案:

答案 0 :(得分:5)

这似乎是正常行为,但Apple提供的更明确的文档可用于澄清我们所看到的内容。

Apple的文档没有提供有关挂起如何工作或何时应该使用的详细说明。但是,我的观点(基于测试和研究)是suspend()应该只用于下载 任务。数据任务应仅使用resume()(以启动任务)和cancel()(适当时)。

我的测试使用Xcode和Charles Proxy,显示暂停数据任务对Apple网络流量没有影响,如Apple的文档中所示。换句话说,就会产生网络流量。

我使用暂停和数据任务观察了两件事:

1)如果在恢复后立即调用它,它对数据任务没有影响。它不会暂停网络流量,也不会阻止网络或服务器端侧问题,回调中会收到成功的响应。

2)如果在dispatch.asyncAfter回调中调用它,它仍然不会暂停网络流量,但是回调会收到“请求超时”错误而不是成功响应。根据Charles Proxy的说法,请求是成功的。正是这个结果让我相信suspend()不应该用于数据任务。在我看来,这次回调的结果基本没用。

取消数据任务:

cancel()按预期工作。客户端(您)在从服务器获得完整响应之前关闭连接。这可以在致电resume()后或稍后(在请求完成之前)完成。

答案 1 :(得分:0)

我接受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()