當前位置:成語大全網 - 新華字典 - iOS開發,如何設置post異步請求超時?

iOS開發,如何設置post異步請求超時?

如果妳用的?AFNetworking

-?(NSMutableURLRequest?*)requestWithMethod:(NSString?*)method?path:(NSString?*)path?parameters:(NSDictionary?*)parameters

//方法通過添加

[request?setTimeoutInterval:10.0];

如果是?ASIHTTPRequest

[request?setNumberOfTimesToRetryOnTimeout:2];

NSMutableURLRequest是NSURLRequest的子類,常用方法有

設置請求超時等待時間(超過這個時間就算超時,請求失敗)

NSMutableURLRequest?*urlRequest?=?[[NSMutableURLRequestalloc]?initWithURL:url?cachePolicy:NSURLRequestUseProtocolCachePolicytimeoutInterval:10];?NSURLConnection?*_connection?=?[[NSURLConnectionalloc]?initWithRequest:urlRequest?delegate:selfstartImmediately:YES];

壹個用來創建請求,壹個用來將請求發送出去。然後我們實現?NSUrlConnectionDelegate 的幾個回調函數就能完成整個流程了。

壹般發送網絡請求都會去設置壹個超時時間,防止請求在那壹直等待。根據不同的場景,我們還需要設置不同的超時時間。在上面的代碼中我們設置了10秒超時。

上面的故事看起來很完美。但是 apple的開發人員在這裏給我們挖了壹個坑。

如果妳的請求是個簡單的“Get”請求,或者木有 body的“post”請求。壹切都是那麽完美,請求能夠按照我們設定的時間自動超時。但是如果妳發的是個“POST”請求,並且[urlRequest setHTTPBody:httpBody]; 那麽,不好意思,妳被潛規則了。

ios3.0 以後 蘋果的sdk對這種情況做了調整,如果是post請求,並且設置了 httpBody,那麽請求的超時時間就被默認設置為 240 秒了。就算妳再使用[urlRequest?setTimeoutInterval:10];也是無效的,我們可以再設置完成後再讀取這個值,發現它不會變成10,依然保持240秒。於是乎,網絡不穩定的時候,妳的程序就可能會陷入漫長的等待。

發現這個問題後。我們通過自己起timer的方式來控制超時。具體怎麽弄這裏就不細說。只說下我們的策略。

我們將整個網絡過程分為 ?鏈接建立,發送數據,數據發送完成等待回包,接收數據 4個階段來控制具體的超時。

設置我們的標準超時時間為 N (系統默認為 10秒,網絡模塊通過暴露相關接口,調用方可自由設置)

鏈接建立鏈接超時時間: N * 1.5

每數據包發送超時時間: N * 1.5

數據發送完成等帶回包超時: N * 2

每數據包接收超時時間: N * 1

以上超時分別在?NSUrlConnectionDelegate 的各個回調階段進行相關設置就能達到比較精細的控制。

特別說明下,為什麽數據發送完成後等待回包的超時會設置的比較長。因為在實際測試過程中發現發包完成到接收到第壹個數據包比較耗時,壹般httpbody越大越明顯,初步猜測是網絡模塊在發送數據緩沖區的數據,所以這裏做了特殊的控制。

部分內容來自於博客園《NSURLCONNECTION 網絡超時的那些事。》