在做网络请求的时候我们很可能需要设置一个请求的超时时间,但是对NSURLSessionConfiguration的timeoutIntervalForRequest属性和NSMutableURLRequest的timeoutInterval属性的区别却不是很清楚。苹果的官方文档NSURLSessionConfiguration里面有一些说明,但是看了之后也不是特别明确。
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.
简单翻译下就是在NSURLRequest中指定的策略会覆盖在NSURLSessionConfiguration中指定的策略,除非NSURLSessionConfiguration中指定的策略更严格。
回到超时这个问题上来,就是酱汁的:
1. 如果你有明确对NSMutableURLRequest对象调用setTimeoutInterval方法,那么此request的超时时间就是此指定的值,无论这个值是不是比session对象的timeoutIntervalForRequest属性值大。
2. 凡是加入到NSURLSession中的request,只要没有显示调用setTimeoutInterval方法,超时时间都将是timeoutIntervalForRequest。
3. 另外需要特别注意的一点是,对NSURLSessionDataTask调用suspend不会暂停超时timer,也就是说suspend一个DataTask,过了设定的超时时间后,会出现超时错误。NSURLSessionDownloadTask是可以suspend的。
总结一下就是,timeoutIntervalForRequest用来给session中所有的request指定一个相同的超时时间,如果相对某个请求单独设置超时时间,请用request的timeoutInterval属性。
由于NSURLSessionConfiguration的timeoutIntervalForResource属性和timeoutIntervalForRequest属性区别很明确,在这儿就不说了。