NSURLSessionConfiguration timeoutIntervalForRequest vs NSURLSession timeoutInterval

Joe*_*ari 22 timeout objective-c ios nsurlsession

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

但NSURLRequest对象上仍有一个timeoutInterval,可用于在会话中创建NSURLSessionTask.

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

小智 19

正如我在iOS 7.0.3上的调查,timeoutIntervalfor NSURLRequest使用时没有任何效果NSURLSession.

无论你设置timeoutIntervalForRequestNSURLSessionConfiguration或没有,timeoutInterval只是忽略.

您可以使用我的小样本应用程序NetworkTimeoutSample来检查此行为.

当你为"URLReq"字段,这会影响设置1 timeoutIntervalNSURLRequest,然后单击"NSURLSession用的URLRequest"按钮,你会不会得到超时错误.

您还可以识别你应该设定timeoutIntervalForResource,而不是timeoutIntervalForRequestNSURLSession,如果你想获得相同的超时影响timeoutIntervalNSURLRequest.

如果同时设置timeoutIntervalForRequesttimeoutIntervalForResourceNSURLSessionConfiguration,则会影响较小的值(我觉得此行为与当前的API文档不同).

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

  • `timeoutIntervalForRequest` 的定时器在数据到达时被重置,无论有多少数据(只要一个字节到达就会重置它),只有在这个时间间隔内绝对没有数据到达时才会导致超时。`timeoutIntervalForResource` 的计时器永远不会重置,除非任务完全完成,否则它会产生超时,因为这将阻止该计时器触发。 (2认同)

Uts*_*sad 5

从iOS8开始,如果服务器不响应,则在后台模式下的NSUrlSession不会调用此委托方法。-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error 下载/上传无限期保持空闲状态。服务器未响应时,在iOS7上调用此委托,但发生错误。

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

因此,基本上timeoutIntervalForRequest在后台会话中不起作用,但是timeoutIntervalForResource将起作用。

我在开发人员论坛上从Apple Staff的一名成员那里得到了这个答案。另外,我已经通过实施验证了这一点。


Mec*_*cki 5

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

\n\n

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

\n\n

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

\n\n

NSURLRequest(及其可变子类)仅提供一种属性timeoutInterval。该超时值的行为类似于timeoutIntervalForRequest以下文档NSURLRequest所说的那样:

\n\n
\n

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

\n
\n\n

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

\n\n

以及文档NSURLSession

\n\n
\n

笔记

\n\n

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

\n
\n\n

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

\n\n

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

\n