首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSURLSessionConfiguration timeoutIntervalForRequest诉NSURLSession timeoutInterval

NSURLSessionConfiguration timeoutIntervalForRequest诉NSURLSession timeoutInterval
EN

Stack Overflow用户
提问于 2013-10-30 16:13:38
回答 4查看 12.7K关注 0票数 25

使用新的NSURLSession,现在在用于创建会话的NSURLSessionConfiguration对象上有一个timeoutIntervalForRequest。

但是,在timeoutInterval对象上仍然有一个NSURLRequest,可以用来在会话中创建NSURLSessionTask。

我的问题是,如果配置将timeoutIntervalForRequest设置为30,但是用于创建任务的NSURLRequest使用的timeoutInterval为60,那么实际将使用哪个超时间隔?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-11-04 06:54:56

由于我对iOS 7.0.3的研究,timeoutInterval for NSURLRequest在与NSURLSession一起使用时并没有收到任何效果。

无论您是否将timeoutIntervalForRequest设置为NSURLSessionConfigurationtimeoutInterval都会被忽略。

您可以使用我的小型示例应用程序NetworkTimeoutSample来检查此行为。

当您为“URLReq”字段设置1,这会影响NSURLRequesttimeoutInterval,然后单击“NSURLSession With URLRequest”按钮,您的会话将不会得到超时错误。

您还可能会意识到应该设置timeoutIntervalForResource,而不是为NSURLSession设置timeoutIntervalForRequest,如果您希望为timeoutInterval of NSURLRequest获得相同的超时效果。

如果同时为timeoutIntervalForRequesttimeoutIntervalForResource设置NSURLSessionConfiguration值,则会影响较小的值(我认为这种行为不同于当前的NSURLSessionConfiguration文档)。

没有关于这些规范的文档,因此它可能在未来的iOS版本中被更改。

票数 23
EN

Stack Overflow用户

发布于 2016-02-12 19:39:49

由于iOS8,如果服务器没有响应,处于后台模式的NSUrlSession不会调用此委托方法。-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error下载/上传无限期地处于空闲状态。当服务器没有响应时,在iOS7上调用此委托时会出现错误。

通常,如果NSURLSession后台会话出现故障,则不会导致任务失败。相反,它继续寻找一个运行请求并在那个时候重试的好时机。这种情况一直持续到资源超时过期(即用于创建会话的timeoutIntervalForResource对象中的NSURLSessionConfiguration属性的值)。该值的当前默认值是一周!换句话说,iOS7中超时失败的行为是不正确的。在后台会话的上下文中,不因网络问题而立即失败更有趣。因此,由于iOS8,即使遇到超时和网络丢失,NSURLSession任务仍在继续。但是,它将一直持续到到达timeoutIntervalForResource为止。

因此,基本上timeoutIntervalForRequest不会在后台会话中工作,但timeoutIntervalForResource会工作。

我从苹果开发者论坛的一位员工那里得到了这个答案。此外,我已经通过实现验证了这一点。

票数 5
EN

Stack Overflow用户

发布于 2019-02-21 11:49:11

NSURLSession提供了两个超时,timeoutIntervalForRequesttimeoutIntervalForResource

timeoutIntervalForRequest由每次传输数据时重置的计时器强制执行。因此,如果将此超时设置为30秒,并且至少每30秒传输一个字节的数据,则永远不会触发超时。只有在30秒内绝对没有数据传输时,超时才会被触发。您还可以说,这是会话任务的最大空闲时间。默认值为60秒。

timeoutIntervalForResource由一个永远不会重置的计时器强制执行。它在会话任务启动时启动,在会话任务停止或完成时停止。因此,这是会话任务所能花费的最大总时间,这也是大多数人听到“超时”时的想法。由于会话任务也可能是通过一个非常慢的Internet链接下载一个100 GB的文件,这里的默认值是7天!

NSURLRequest (及其可变子类)只提供一个属性timeoutInterval。这个超时值的行为类似于timeoutIntervalForRequest,因为NSURLRequest的文档说:

如果在尝试连接期间,请求保持空闲的时间超过超时间隔,则该请求被视为超时。

来源:timeoutInterval - NSURLRequest \ Apple文档

NSURLSession的文档显示:

Note 在某些情况下,此配置中定义的策略可能被为任务提供的NSURLRequest对象指定的策略覆盖。除非会话的策略限制性更强,否则将尊重请求对象上指定的任何策略。

来源:NSURLSessionConfiguration - Foundation \ Apple文档

因此,timeoutInterval of a NSURLRequest将覆盖NSURLSessiontimeoutIntervalForRequest,但前提是它被系统认为“限制性更强”,否则NSURLSession的值将获胜。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19688175

复制
相关文章

相似问题

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