在IOS開發過程中,ASIHttpRequest庫是最常用的網路程式庫,功能強大,使用也非常方便。
但是,在使用此庫過程中,發現有幾點小問題。網路上仔細搜尋研究了好久,現記錄於此。
問題1:
一個問題是,我發現當非同步請求比較多,並發串連數量比較多的時候,會導致一些請求失敗。
原因:
代碼預設是最大4個並發串連,其他的串連需要等待。然後如果有串連請求完畢了,就會去複用這個串連,但是還會出現串連關閉的情況,這個時候代碼不會再一次重新請求,導致這次請求失敗,返回nil。
簡單解決:
最簡單的解決就是把複用串連關閉,每次都建立串連就不會出問題。或者一次只允許一個串連。
ASIHttpRequest裡加入下面代碼 [self setShouldAttemptPersistentConnection:NO];
問題2:
另一個問題是偶爾出現異常,在ASIHTTPRequest的startAsynchronous調用後偶爾出現EXC_BAD_ACCESS異常。
在ViewController中是採用委託的方式,即在- (void)viewDidLoad方法中加入代碼:[request setDelegate:self]
然後實現其委託方法- (void)requestFinished:(ASIHTTPRequest *)request和- (void)requestFailed:(ASIHTTPRequest *)request
測試過程中發現,在執行請求未結束時候不斷關閉和開啟此介面,就容易出現EXC_BAD_ACCESS異常。
解決方案:
在stackoverflow.com上,有網友提出了兩個解決方案。
第一個,使用同一的delegate,並且應用一運行就初始化它。如果其他類要調用非同步請求,將delegate發過去。
調用方法如下:
- (void)sendUrl: (NSString *) restUrl withCallBack:(NSObject*) delegate;
然後,在delegate的實現方法中利用request的tag來標識來自哪一個類的非同步呼叫。
第二個,使用block直接實現非同步請求,拋棄delegate。
使用"setCompletionBlock:^"代替delegate的"setDidFinishSelector"。
request做一個設定就可以,比原來通過設定request.delegate再實現delegate的方法簡單多了。
[request setCompletionBlock :^{
// 請求響應結束,返回 responseString
NSString *responseString = [request responseString ]; // 對於 2 進位資料,使用 NSData 返回 NSData *responseData = [request responseData];
NSLog ( @"%@" ,responseString);
}];
[request setFailedBlock :^{
// 請求響應失敗,返回錯誤資訊
NSError *error = [request error ];
NSLog ( @"error:%@" ,[error userInfo ]);
}];