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.
无论你设置timeoutIntervalForRequest的NSURLSessionConfiguration或没有,timeoutInterval只是忽略.
您可以使用我的小样本应用程序NetworkTimeoutSample来检查此行为.
当你为"URLReq"字段,这会影响设置1 timeoutInterval对NSURLRequest,然后单击"NSURLSession用的URLRequest"按钮,你会不会得到超时错误.
您还可以识别你应该设定timeoutIntervalForResource,而不是timeoutIntervalForRequest对NSURLSession,如果你想获得相同的超时影响timeoutInterval的NSURLRequest.
如果同时设置timeoutIntervalForRequest和timeoutIntervalForResource值NSURLSessionConfiguration,则会影响较小的值(我觉得此行为与当前的API文档不同).
没有关于这些规范的文档,因此可能会在未来的iOS版本上进行更改.
从iOS8开始,如果服务器不响应,则在后台模式下的NSUrlSession不会调用此委托方法。-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
下载/上传无限期保持空闲状态。服务器未响应时,在iOS7上调用此委托,但发生错误。
通常,如果网络出现问题,则NSURLSession后台会话不会使任务失败。相反,它继续寻找良好的时间来运行请求并在那时重试。这将一直持续到资源超时到期为止(即,用于创建会话的NSURLSessionConfiguration对象中的timeoutIntervalForResource属性的值)。该值的当前默认值为一周!换句话说,iOS7中超时失败的行为是不正确的。在后台会话的上下文中,更有趣的是不会由于网络问题而立即失败。因此,自iOS8起,即使遇到超时和网络丢失,NSURLSession任务也会继续。但是,它将继续直到达到timeoutIntervalForResource。
因此,基本上timeoutIntervalForRequest在后台会话中不起作用,但是timeoutIntervalForResource将起作用。
我在开发人员论坛上从Apple Staff的一名成员那里得到了这个答案。另外,我已经通过实施验证了这一点。
NSURLSession提供两个超时,timeoutIntervalForRequest并且timeoutIntervalForResource.
timeoutIntervalForRequest由每次数据传输时重置的计时器强制执行。因此,如果将此超时设置为 30 秒,并且每 30 秒至少传输一个字节的数据,则永远不会达到超时。仅当 30 秒内完全没有数据传输时才会发生超时。你也可以说这是最大空闲时间会话任务的默认值为 60 秒。
timeoutIntervalForResource由永不重置的计时器强制执行。它在会话任务启动时启动,在会话任务停止或完成时停止。因此,这是会话任务可以花费的最大总时间,也是大多数人在听到“超时”时想到的。由于会话任务也可能是通过非常慢的 Internet 链接下载 100 GB 文件,因此此处的默认值为 7 天!
NSURLRequest(及其可变子类)仅提供一种属性timeoutInterval。该超时值的行为类似于timeoutIntervalForRequest以下文档NSURLRequest所说的那样:
\n\n\n如果在连接尝试期间请求保持空闲的时间超过超时间隔,则该请求将被视为超时。
\n
来源:timeoutInterval - NSURLRequest | 苹果开发者文档
\n\n以及文档NSURLSession:
\n\n\n笔记
\n\n在某些情况下,此配置中定义的策略可能会被为任务提供的 NSURLRequest 对象指定的策略覆盖。除非会话\xe2\x80\x99s 策略更具限制性,否则将遵守请求对象上指定的任何策略。
\n
来源:NSURLSessionConfiguration - 基础 | 苹果开发者文档
\n\n因此,timeoutIntervala 的NSURLRequest会覆盖timeoutIntervalForRequesta 的NSURLSession,但前提是系统认为它“更具限制性”,否则 a 的值NSURLSession将获胜。