首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSURLSessionTask。暂停不起作用

NSURLSessionTask。暂停不起作用
EN

Stack Overflow用户
提问于 2016-11-17 18:05:29
回答 3查看 2.8K关注 0票数 8

这是苹果文档中关于suspendNSURLSessionTask方法的说明

任务虽然挂起,但不会产生网络流量,也不受超时的影响。

好的。因此,我运行以下简单代码:

代码语言:javascript
复制
        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秒内,使用超时错误调用完成块。有人能解释一下怎么回事吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-17 19:36:28

这似乎是正常的行为,不过苹果提供的更明确的文档将有助于澄清我们所看到的东西。

苹果的文档并没有详细解释挂起是如何工作的,以及何时使用。然而,--我的观点是,(基于测试和研究)认为,suspend()只应该用于下载任务。数据任务应该只在适当时使用resume() (启动任务)和cancel()

我使用Xcode和Charles进行的测试显示,一个挂起的数据任务对网络流量没有影响,如苹果的文档所示。换句话说,网络流量是产生的。

使用挂起和数据任务观察到了两种情况:

1)如果在恢复后立即调用它,则对数据任务没有任何影响。它不挂起网络流量,除非出现网络或服务器端问题,回调中将收到成功的响应。

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

取消数据任务:

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

票数 7
EN

Stack Overflow用户

发布于 2017-02-17 10:47:22

我接受挂起()对URLSessionDataTask没有任何影响

代码语言:javascript
复制
                    let dataTask = URLSession.shared.dataTask(with: request) { (data, urlResponse, error) in                        
                    print("response is received all the time")
                    }
                }
                dataTask.resume()
                dataTask.suspend()

然而,当我尝试取消它的时候

代码语言:javascript
复制
let dataTask = URLSession.shared.dataTask(with: request) { (data, urlResponse, error) in                        
                    print("response is cancelled")
                    }
                }
                dataTask.resume()
                dataTask.cancel()
票数 0
EN

Stack Overflow用户

发布于 2022-04-11 06:09:44

您可以使用URLRequest调用timeoutInterval,并将timeoutInterval设置为.infinity。(缺省值为60)

代码语言:javascript
复制
var request = URLRequest(url: url)
request.timeoutInterval = .infinity
task = session.dataTask(with: request)
task?.resume()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40662007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档