NSURLRequest的超时陷阱

最近被报了个问题,说我们的模块在网络情况不佳的时候,接口访问经常在那儿等待,不会超时!

第一反应去查了代码里头设置的超时时间,发现设置的是30s,但是从表现来看,确实超时时间远超30s,经常一两分钟才超时,甚至更久。也就是说,我明明设置了NSURLRequest(NSURLConnection)的超时时间,但是他却没有超时返回!超时参数timeoutInterval没有生效!

开始怀疑系统的问题,于是上网查,终于在StackOverFlow上有人提到说iPhone的超时时间是4分钟;继续查找,发现有人提到,在iPhone上,仅仅当你使用POST方式的时候,系统的最小超时时间会是240s。

(2012-10-30编辑补充:该问题在ios6上已得到修正,不在是最小240s了)

 

所以做了个试验:

 

  
  
  
  
  1.    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]; 
  2.    NSLog(@"default time out %f(GET)", request.timeoutInterval); 
  3.    request.timeoutInterval = 10; 
  4.    NSLog(@"custom time out %f(GET)", request.timeoutInterval); 
  5.  
  6. [request setHTTPMethod:@"POST"]; 
  7.    NSLog(@"time out %f(POST NO DATA)", request.timeoutInterval); 
  8.  
  9. [request setValue:@"application/octet-stream" forHTTPHeaderField: @"Content-Type"];  
  10.    NSData *data = [@"hello" dataUsingEncoding:NSUTF8StringEncoding]; 
  11.    NSString *postLength = [NSString stringWithFormat:@"%d", [data length]]; 
  12.    [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
  13.    [request setHTTPBody:data]; 
  14.    NSLog(@"time out %f(POST WITH DATA)", request.timeoutInterval);     
  15.     
  16.    request.timeoutInterval = 10; 
  17.    NSLog(@"time out %f(POST WITH DATA)", request.timeoutInterval);         
  18.     
  19.    request.timeoutInterval = 250; 
  20.    NSLog(@"time out %f(POST WITH DATA)", request.timeoutInterval);   

运行结果输出如图:

 

  
  
  
  
  1. 2011-12-22 16:36:49.681 Untitled[2474:207] default time out 60.000000(GET) 
  2. 2011-12-22 16:36:49.683 Untitled[2474:207] custom time out 10.000000(GET) 
  3. 2011-12-22 16:36:49.684 Untitled[2474:207] time out 10.000000(POST NO DATA) 
  4. 2011-12-22 16:36:49.684 Untitled[2474:207] time out 240.000000(POST WITH DATA) 
  5. 2011-12-22 16:36:49.685 Untitled[2474:207] time out 240.000000(POST WITH DATA) 
  6. 2011-12-22 16:36:49.686 Untitled[2474:207] time out 250.000000(POST WITH DATA) 

证实,确实在使用POST并且带有数据的情况下NSURLRequest的超时时间最短是240s!所以遇到NSURLRequest超时不返回的时候,不要再被吓到了。

说实话,还是觉得很无奈,不过据说苹果这么做的原因是,考虑到iPhone从睡眠唤醒的时候,网络的唤醒需要时间,所以做了这个设置。这个我可以理解,但是为什么不把这个写在文档里头呢!让我在被质问的时候很无语。。。

你可能感兴趣的:(超时,NSURLRequest,timeoutInterval)