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 超时的主要内容,如果未能解决你的问题,请参考以下文章