24

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

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

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

4

4 回答 4

23

正如我对 iOS 7.0.3 的调查,timeoutIntervalforNSURLRequest在与NSURLSession.

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

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

当您为 'URLReq' 字段设置 1 时,它会影响timeoutIntervalNSURLRequest然后单击 'NSURLSession With URLRequest' 按钮,您的会话将不会出现超时错误。

如果您想为 of 获得相同的超时效果,您也可能认识到您应该设置timeoutIntervalForResource, 而不是timeoutIntervalForRequestfor 。NSURLSessiontimeoutIntervalNSURLRequest

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

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

于 2013-11-04T06:54:56.433 回答
5

从 iOS8 开始,后台模式下的 NSUrlSession 如果服务端没有响应,就不会调用这个委托方法。-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error 下载/上传无限期地保持空闲。当服务器没有响应时,在 iOS7 上调用此委托时会出错。

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

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

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

于 2016-02-12T19:39:49.757 回答
4

NSURLSession提供两个超时,timeoutIntervalForRequest并且timeoutIntervalForResource.

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

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

NSURLRequest(及其可变子类)仅提供一个属性timeoutInterval。此超时值的行为类似于timeoutIntervalForRequest文档中NSURLRequest所说的:

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

来源:timeoutInterval - NSURLRequest | 苹果开发者文档

并且文档NSURLSession说:

笔记

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

来源:NSURLSessionConfiguration - 基础 | 苹果开发者文档

所以timeoutIntervala 的 aNSURLRequest会覆盖timeoutIntervalForRequesta 的 a ,NSURLSession但前提是它被系统认为“更具限制性”,否则 a 的值NSURLSession将获胜。

于 2019-02-21T11:49:11.260 回答
2

自从 n-miyo 测试以来,情况似乎发生了变化。

苹果文档声明 NSURLRequest 值将覆盖会话配置。

在某些情况下,此配置中定义的策略可能会被为任务提供的 NSURLRequest 对象指定的策略覆盖。除非会话的策略更具限制性,否则在请求对象上指定的任何策略都会受到尊重。例如,如果会话配置指定不应允许蜂窝网络,则 NSURLRequest 对象不能请求蜂窝网络。

于 2016-10-06T16:24:29.697 回答