天天看點

【ios】使用Block對POST異步操作的簡單封裝

以下内容為原創,歡迎轉載,轉載請注明

一般情況下的POST異步操作需要實作以下幾步:

1. 在controller.h上實作<NSURLConnectionDataDelegate>協定

2. 實作協定的幾個方法,

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

3. 編寫執行post請求的代碼:

如果controller有很多異步操作,處理就會很麻煩,而且,很多時候我們隻需要處理完成和異常(比如逾時)的時候的回報即可

是以,我需要編寫一個post請求的封裝類,隻要傳入請求的url、請求參數(字元串形式)、完成時的回調block

首先,建立類:HttpPostExecutor,.h如下:

實作了<NSURLConnectionDataDelegate>協定,因為它要接收post請求的幾個回調。

有一個NSMutableData對象,這個對象用于儲存請求的結果。

一個finishCallbackBlock的block,這個block用于執行完成後的回調,這個block傳入的參數就是傳回的結果(這個結果已轉成utf-8編碼的字元串形式),我們可以在這個block中去處理請求完成後的邏輯

還有一個類方法,這個類方法暴露給外面,讓外面進行調用

接下來,我們看下實作的方法.m檔案:

【ios】使用Block對POST異步操作的簡單封裝
【ios】使用Block對POST異步操作的簡單封裝

View Code

在這個實作類中,我們在類方法中,先生成一個HttpPostExecutor對象,這個對象用于post請求的回調(因為實作了<NSURLConnectionDataDelegate>協定),然後去執行post連接配接。

接下來就等下面實作的回調方法被自動調用了,一旦調用

這個方法,就對resultData(用于存儲post請求結果)進行初始化或者清空,因為要開始真正存儲資料了嘛;

這個方法進行回調的時候,把傳回過來的這部分資料存儲到resultData中,沒什麼好說的;

一旦回調- (void)connectionDidFinishLoading:(NSURLConnection *)connection這個方法,說明資料傳輸完畢了,要做的邏輯就是把資料轉成utf-8編碼的字元串,然後回調我們設定的回調finishCallbackBlock,把轉好的結果字元串傳進去,這樣我們在回調block方法中實作的邏輯就能正常執行了。

一旦回調- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error這個方法,說明請求過程中出錯了,比如斷電、逾時等,這時候,也回調我們設定的回調finishCallbackBlock,nil作為結果,這樣我們在finishCallbackBlock中就能判斷是正常的執行了post還是出了問題。

好了,接下來,我們就可以在外面去調用了,如下:

這樣,以後post請求隻需要去調用上面這個方法,在回調block中去處理結果

之後,在我們的代碼編寫中,就可以隻關心業務邏輯,不需要去在意請求協定和回調了

<a href="http://pan.baidu.com/s/1uxVGh">測試demo下載下傳</a>