[IOS] ASIHttpRequest庫使用過程中發現的幾個小問題

來源:互聯網
上載者:User

在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 ]);
    }];

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.