開始建構你的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進來就可以直接使用。
下一章節我們再來實際使用。