開始建構你的AFNetworking

當你的專案開始複雜,Code愈寫愈多的時候,盡量遵循MVC的原則(M = Model; V = View; C = Controller),像在下一開始寫程式時一點概念都沒有,公司也沒有寫App的前輩,就把所有的東西全部擠在一個ViewController裡面,加上一開始還不會用Xib,建UI還是純代碼,寫完一個畫面沒兩三個功能,Code隨隨便便就破千行,然後沒分類就很開心的一直寫下去,最後就是導致下場很慘......咳咳,廢話不多說了,進入主題吧。

1.首先經過上一章節我們已經會使用CocoaPods來管理好我們的第三方套件了,接下來我們就開始建構AFNetworking吧,讓我們先開一個Class,繼承NSObject,在這邊我把它取名為TestAPI。

2.我們進入到TestAPI.h檔,加上這些程式碼,等等會一一詳細講解。

我們在.h檔首先要把AFNetworking給import進來,然後宣告兩個block,一個是回傳成功的方法,一個是回傳失敗的方法,然後init跟request兩個方法我們留到.m檔再討論,這個TestAPI的Class裡面我想要使用兩個API,一個是我傳入名字得到外號;另一個是我傳入名字得到年齡。

3.接著再進到.m檔裡面把block建好。

我宣告的兩個block:

          (^finishBlock) (id) 傳進一個任意型別,接收後再處理

          (^failBlock) (int, int)傳進兩個int分別是伺服器會給你的StatusCode跟ErrorCode;

先記得這個就好,我們後面會再繞回來說。init沒什麼好說的,就是之後方法回傳我們會把結果包進這個block而已,request這邊就是我們在做請求的時候,要把整個包好的東西丟回去給你呼叫的Class做處理。

4.先建置取得外號的方法。

5.再建置取得年齡的方法。

其實方法有分Get、Put、Post...等方法,這邊我範例做Post而已,剩下都大同小異,差異性稍微看一下官方的文檔就可以知道了。首先當然要宣告一個字串的Url來知道你的接口位置,通常前面的IP不會變,後面的接口位置會變,所以我個人會習慣把IP跟各個接口位置define起來所以會變成:

          NSString *urlAPI = [NSString stringWithFormat:@"%@%@",後台ip,接口位置];

manager這邊要注意的是

          manager.requestSerializer = [AFJSONRequestSerializer serializer];

          manager.responseSerializer = [AFJSONResponseSerializer serializer];

這兩個方法,我們現在是丟json回json(AFNetworking會幫你轉好),如果回的是Http的話,那就要變成:

          manager.responseSerializer = [AFHTTPResponseSerializer serializer];

parameters用一包Dictnoary丟過去就好,對應後台的Key - Value。成功跟失敗部分我們先看

          self.finishBlock(responseObject);

          self.failBlock((int)statusCode, (int)errorCode);

這兩行簡單的說就是把成功回的responseObject塞進block裡面,伺服器的StatusCode跟ErrorCode塞進失敗的block裡,然後你的block就會在呼叫對應方法之後傳回你的ViewController。

6.AFNetworking3.0取得error變得比較複雜一點了,我們不能直接使用error就取到我們想要的東西,必須要做一些處理,首先我們再開一個Class一樣繼承NSObject(其實繼承什麼都沒關係,我習慣同時有傳值跟回傳值的Model用C的function來寫),我把它取名為HttpResponseErrorCode。

7.在這邊.h檔我先建置了三個分法,分別是取到StatusCode、ErrorCode、Error(ErrorMessage要從這裡撈)。

8.然後.m檔的方法如下:

這邊要取得userInfo裡面的[AFNetworkingOperationFailingURLResponseDataErrorKey],再轉型成NSData,再用JSONObject接,然後就可以轉成Dictionary了,不要問我為什麼這麼複雜......不這樣轉還真轉不出來,有成功用其他方法轉出來的前輩也麻煩指教一下。

9.接著我們回到第4跟第5步驟的fail的處理看

          NSInteger statusCode = getErrorStatusCode(task);

          NSInteger errorCode = getErrorCode(error);

          NSDictionary *errorDict = getError(error);

          NSString *errorMessage = errorDict[@"message"];

          NSLog(@"error : %@",errorMessage);

          self.failBlock((int)statusCode, (int)errorCode);

這樣是不是了解了呢~~C function的好處就是直接import進來就可以直接使用。

下一章節我們再來實際使用。

results matching ""

    No results matching ""