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從睡眠喚醒的時候,網絡的喚醒需要時間,所以做了這個設置。這個我可以理解,但是爲什麼不把這個寫在文檔裏頭呢!讓我在被質問的時候很無語。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章