2013-10-30 26 views
18

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

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

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

回答

17

正如我调查iOS 7.0.3,timeoutIntervalNSURLRequestNSURLSession一起使用时没有产生任何效果。

无论您是否为NSURLSessionConfiguration设置timeoutIntervalForRequesttimeoutInterval都被忽略。

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

当您为'URLReq'字段设置1时,会影响timeoutInterval对于NSURLRequest,然后单击'NSURLSession With URLRequest'按钮,您的会话将不会收到超时错误。

您也可以识别你应该设置timeoutIntervalForResource,而不是timeoutIntervalForRequestNSURLSession,如果你想获得的NSURLRequesttimeoutInterval相同的超时影响。

如果同时为NSURLSessionConfiguration设置了timeoutIntervalForRequesttimeoutIntervalForResource值,则较小的值将受到影响(我感觉此行为与当前API文档不同)。

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

+0

嗨,你的回答让我朝着正确的方向发展。它使我意识到应该使用timeoutIntervalForRequest和timeoutIntervalForResource。不过,在后台使用NSURLSessionDownloadTask时,我看不到在超时延迟之后调用任何回调。与您一起调用哪个回调会超时?它仍然是URLSession:任务:didCompleteWithError:? –

+0

好吧,它看起来像不工作时,使用后台会话......但在使用后台会话时不起作用... –

+0

我想我的Web服务的超时间隔为180秒(3分钟)。因为我读关于NSURLSESSION和它的timeoutIntervalForRequest和timeoutIntervalForResource,我试过使用这些,它再次产生了与NSMutableURLRequest.ie的timeOutInterval相同的结果,我设置超时间隔为180秒,如sessionConfig.timeoutIntervalForRequest = 180.0; sessionConfig.timeoutIntervalForResource = 180.0;但我在75秒内或以某个随机时间间隔接到失败电话,说'请求超时'。对此有任何想法? – XiOS

4

自iOS8以来,如果服务器没有响应,背景模式下的NSUrlSession不会调用这个委托方法。 -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error 下载/上传将无限期保持空闲状态。当服务器没有响应时,这个委托在iOS7上调用,出现错误。

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

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

我从苹果员工之一developer forum得到了这个答案。另外,我已通过实施验证了这一点。

+1

我正在使用NSURLSession来检查给定的URL是否仍然活动或中断,任何建议什么时候我应该设置'timeoutIntervalForResource'?我的目标是将其设置为确定网址是否处于活动状态所需的绝对最短时间? – GarySabo

+1

在我的实验中,如果您为'NSURLRequest'设置'timeoutInterval'为15秒,并且'NSURLSession'为后台会话,则iOS将继续重试约。每15秒到达'timeoutIntervalForResource'。当然,如果iOS认为你的网络是好的,它将会发生。没有回调将被称为 - 这是真的。测试iOS 9.2/ –

+0

@GarySabo:我认为你应该使用可达性模块。 –

2

看起来事情发生了变化,因为n-miyo测试了它。

apple documentation指出NSURLRequest值将覆盖会话配置。

In some cases, the policies defined in this configuration may be overridden by policies specified by an NSURLRequest object provided for a task. Any policy specified on the request object is respected unless the session’s policy is more restrictive. For example, if the session configuration specifies that cellular networking should not be allowed, the NSURLRequest object cannot request cellular networking.

相关问题