最近被報了個問題,說我們的模塊在網絡情況不佳的時候,接口訪問經常在那兒等待,不會超時!
第一反應去查了代碼裏頭設置的超時時間,發現設置的是30s,但是從表現來看,確實超時時間遠超30s,經常一兩分鐘才超時,甚至更久。也就是說,我明明設置了NSURLRequest(NSURLConnection)的超時時間,但是他卻沒有超時返回!超時參數timeoutInterval沒有生效!
開始懷疑係統的問題,於是上網查,終於在StackOverFlow上有人提到說iPhone的超時時間是4分鐘;繼續查找,發現有人提到,在iPhone上,僅僅當你使用POST方式的時候,系統的最小超時時間會是240s。
(2012-10-30編輯補充:該問題在ios6上已得到修正,不在是最小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從睡眠喚醒的時候,網絡的喚醒需要時間,所以做了這個設置。這個我可以理解,但是爲什麼不把這個寫在文檔裏頭呢!讓我在被質問的時候很無語。。。