最近被报了个问题,说我们的模块在网络情况不佳的时候,接口访问经常在那儿等待,不会超时!
第一反应去查了代码里头设置的超时时间,发现设置的是30s,但是从表现来看,确实超时时间远超30s,经常一两分钟才超时,甚至更久。也就是说,我明明设置了NSURLRequest(NSURLConnection)的超时时间,但是他却没有超时返回!超时参数timeoutInterval没有生效!
开始怀疑系统的问题,于是上网查,终于在StackOverFlow上有人提到说iPhone的超时时间是4分钟;继续查找,发现有人提到,在iPhone上,仅仅当你使用POST方式的时候,系统的最小超时时间会是240s。
所以做了个试验:
- NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]];
- NSLog(@"default time out %f(GET)", request.timeoutInterval);
- request.timeoutInterval = 10;
- NSLog(@"custom time out %f(GET)", request.timeoutInterval);
- [request setHTTPMethod:@"POST"];
- NSLog(@"time out %f(POST NO DATA)", request.timeoutInterval);
- [request setValue:@"application/octet-stream" forHTTPHeaderField: @"Content-Type"];
- NSData *data = [@"hello" dataUsingEncoding:NSUTF8StringEncoding];
- NSString *postLength = [NSString stringWithFormat:@"%d", [data length]];
- [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
- [request setHTTPBody:data];
- NSLog(@"time out %f(POST WITH DATA)", request.timeoutInterval);
- request.timeoutInterval = 10;
- NSLog(@"time out %f(POST WITH DATA)", request.timeoutInterval);
- request.timeoutInterval = 250;
- NSLog(@"time out %f(POST WITH DATA)", request.timeoutInterval);
运行结果输出如图:
- 2011-12-22 16:36:49.681 Untitled[2474:207] default time out 60.000000(GET)
- 2011-12-22 16:36:49.683 Untitled[2474:207] custom time out 10.000000(GET)
- 2011-12-22 16:36:49.684 Untitled[2474:207] time out 10.000000(POST NO DATA)
- 2011-12-22 16:36:49.684 Untitled[2474:207] time out 240.000000(POST WITH DATA)
- 2011-12-22 16:36:49.685 Untitled[2474:207] time out 240.000000(POST WITH DATA)
- 2011-12-22 16:36:49.686 Untitled[2474:207] time out 250.000000(POST WITH DATA)
证实,确实在使用POST并且带有数据的情况下NSURLRequest的超时时间最短是240s!所以遇到NSURLRequest超时不返回的时候,不要再被吓到了。
说实话,还是觉得很无奈,不过据说苹果这么做的原因是,考虑到iPhone从睡眠唤醒的时候,网络的唤醒需要时间,所以做了这个设置。这个我可以理解,但是为什么不把这个写在文档里头呢!让我在被质问的时候很无语。。。
本文出自 “风沙” 博客,请务必保留此出处http://kensou.blog.51cto.com/3495587/748691