2010-03-18 19 views
3

我遇到網絡請求應該超時的問題,但該方法未被調用。請求如下:iPhone SDK:URL請求不會超時

#define kCONNECT_TIMEOUT 20.0 

request = [NSMutableURLRequest requestWithURL: aUrl]; 
[request setHTTPMethod: @"POST"]; 
postData = [jsonData dataUsingEncoding:NSASCIIStringEncoding]; 
[request setHTTPBody:postData]; 
[request setValue:@"text/xml" forHTTPHeaderField:@"Accept"]; 
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
[request setCachePolicy:NSURLCacheStorageAllowed]; 
[request setTimeoutInterval:kCONNECT_TIMEOUT]; 
self.connection = [NSURLConnection connectionWithRequest:request delegate:self]; 
assert(self.connection != nil); 

這應該得到一個回調

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)_error 

但不顯示錯誤消息,4分鐘後。任何人都知道這可能是爲什麼?

+0

重複http://stackoverflow.com/questions/1466389/nsmutableurlrequest-timeout-interval-not-taken-into-consideration-for-post-reques – KevinDTimm 2010-03-18 16:28:22

+0

這個問題已在iOS 4的起 – Abhi 2012-02-16 13:48:53

回答

2

蘋果一名代表透露說,SDK 3.0和更高版本強制執行(你猜對了)4分鐘最小超時:

https://devforums.apple.com/thread/25282

如果你嘗試設置的低於240秒的超時值,它會被限制爲240.如果您需要更短的超時時間,我會爲St3fan的解決方案投下我的票。

+0

沒有sh * t Sherlock!你是對的。這是一個計時器。 – user279778 2010-03-18 23:53:58

+0

現在完成所有工作。感謝您的評論。 – user279778 2010-03-19 15:25:03

3

如果你想使用NSURLConnection http請求超時更好管理則是更好的運行要求異步連同NSTimer,可以取消NSURLConnection火災時,因爲超時時間已過。

這也意味着你不必處理線程,這通常是一個好主意。基於異步事件(runloop)的操作是iPhone上99.9%的案例。

+0

我想上面的代碼是異步的,不是嗎?所以你說的是請求setTimeoutInterval被破壞,而且更好地顯式定義一個單獨的計時器呢? – user279778 2010-03-18 17:17:18

+0

對不起,你是對的。你的代碼是異步的。但是,是的,同樣適用。如果您希望更好地控制超時,那麼只需在請求旁邊運行一個計時器即可。 – 2010-03-18 18:15:24

+0

我最近做了一個演示應用程序,並沒有互聯網連接,我注意到,是的,它確實超時了,因爲它應該。這是使用iOS 4,所以現在可能這個問題已經修復。 – user279778 2010-08-23 12:41:44