NSURLSession 超时

Posted

技术标签:

【中文标题】NSURLSession 超时【英文标题】:NSURLSession timeout 【发布时间】:2016-01-03 21:16:13 【问题描述】:

我有一个函数请求获取JSON

let request = NSMutableURLRequest(URL: NSURL(string: path)!)
let session = NSURLSession.sharedSession()

session.configuration.timeoutIntervalForRequest = 5
session.configuration.timeoutIntervalForResource = 5

let task = session.dataTaskWithRequest(request, completionHandler: data, response, error -> Void in
     let json:JSON = JSON(data: data!)
     onCompletion(json, error)
)
task.resume()

这可行,但我遇到了超时问题。如果请求时间超过 5 秒,我想取消操作。任何想法如何做到这一点?

调用可能需要超过 5 秒,但它仍然会触发并且超时不会执行任何操作。如果超时被触发,我需要做什么吗?

更新

        let request = NSMutableURLRequest(URL: NSURL(string: path)!)

        let urlconfig = NSURLSessionConfiguration.defaultSessionConfiguration()
        urlconfig.timeoutIntervalForRequest = 5
        urlconfig.timeoutIntervalForResource = 5
        let session = NSURLSession(configuration: urlconfig, delegate: self, delegateQueue: nil)

        let task = session.dataTaskWithRequest(request, completionHandler: data, response, error -> Void in
            let json:JSON = JSON(data: data!)
            onCompletion(json, error)
        )
        task.resume()

【问题讨论】:

您已经使用了 5 秒的超时间隔请求。你还需要什么? 这不起作用...我尝试将该值更改为 0.01,但在加载超过 4 秒时它仍然加载。如果 timeoutIntervalForRequest 或 timeoutIntervalForResource 被触发,我是否必须处理? @Mr.T,这不是重复我已阅读该帖子并查看我上面的评论。 【参考方案1】:

您无法更改 sharedSession 或会话 configuration 属性的超时。您必须在创建会话时设置超时。有关如何创建会话及其超时的示例,请参阅此:https://***.com/a/30427187/78496

【讨论】:

我不太明白如何将该帖子与我的代码集成,有什么想法吗? @user5700760 - 将您的let session = ... 行替换为该答案中的四行(尽管您可以参考session,而不是参考self.session)。关键是实例化你自己的NSURLSessionConfiguration,设置它的超时参数,然后使用那个配置而不是使用共享会话来实例化你自己的NSURLSession 我现在已经更新了我的代码(请参阅我的问题中的更新),但是现在当代码达到超时时,它会在let json:JSON = JSON(data: data!) 崩溃并显示消息:致命错误:在展开时意外发现 nil可选值 如果它超时,那么data 将为零,因为它没有收到任何东西。在对 data 进行任何操作之前,您必须检查 error 是否不为零 感谢 chedabob 和 Rob,感谢您的帮助。

以上是关于NSURLSession 超时的主要内容,如果未能解决你的问题,请参考以下文章

NSURLSession详解

iOS开发-NSURLSession

网络NSURLSession

iOS 编程:NSURLSession

iOS开发-NSURLSession详解

iOS 使用NSURLSession下载大文件