AFNetworking的原理與基本使用

全稱是AFNetworking

雖然運行效率沒有ASI高,但是使用比ASI簡單

是對NSURLConnection和NSURLSession的各自的一層包裝

AFN的內(nèi)部中的RunLoop

AFN內(nèi)部開了一條專門用來訪問網(wǎng)絡(luò)請求的線程

在這個開線程的方法中,他把方法和dispatch_once都用static修飾了下

以保證這個方法的安全性以及只開辟一塊內(nèi)存空間,而且保證他線程不死

在這個方法中他會調(diào)用另一個網(wǎng)絡(luò)請求入口的方法

在這個入口方法中他會創(chuàng)建一個RunLoop

然后添加一個NSMachPort端口,目的是為了讓他里面有Source(因為有了Source的RunLoop才能真正跑起來)

然后啟動RunLoop,通過RunLoop在里面不斷的循環(huán),不斷的發(fā)送消息,讓他做事情.

1 - 基于NSURLConnection包裝的重要對象(iOS9-NSURLConnection已經(jīng)不能使用)

AFHTTPRequestOperationManager

封裝了HTTP請求的常見處理

GET\POST請求

解析服務(wù)器的響應(yīng)數(shù)據(jù)

// 創(chuàng)建

// AFHTTPRequestOperationManager內(nèi)部包裝了NSURLConnection

AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

Snip20150926_5.png

1 - 1 AFHTTPRequestOperationManager的GET請求

Snip20150926_8.png

參數(shù)是不用拼接的,AFN內(nèi)部會幫你遍歷字典然后幫你拼接完成,只需把參數(shù)傳入即可.

請求成功會來到第一個block,id responseObject這個參數(shù),會自動幫你從服務(wù)器得到的JSON數(shù)據(jù)轉(zhuǎn)為字典或者數(shù)組(用id就是因為不一定返回的是什么數(shù)據(jù).所以要用到id);他的內(nèi)部無非也就是一個Request對象

NSError *error返回的是錯誤信息

1 - 2 AFHTTPRequestOperationManager的POST請求

- (NSURLSessionDataTask *)POST:(NSString *)URLString

? ? ? ? ? ? ? ? ? parameters:(id)parameters

? ? ? ? ? ? ? ? ? success:(void (^)(NSURLSessionDataTask *task, id responseObject))success

? ? ? ? ? ? ? ? ? failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure

Snip20150926_9.png

POST請求和GET沒什么兩樣,無非就是把GET改為POST即可

2 - 基于NSURLSession包裝的重要對象.

AFHTTPSessionManager

封裝了HTTP請求的常見處理

GET\POST請求

解析服務(wù)器的響應(yīng)數(shù)據(jù)

AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];

Snip20150926_5.png

2 - 1AFHTTPSessionManager的GET請求

- (NSURLSessionDataTask *)GET:(NSString *)URLString

parameters:(id)parameters

success:(void (^)(NSURLSessionDataTask *task, id responseObject))success

failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure

Snip20150926_15.png

2 - 2 AFHTTPSessionManager的POST請求

- (NSURLSessionDataTask *)POST:(NSString *)URLString

parameters:(id)parameters

success:(void (^)(NSURLSessionDataTask *task, id responseObject))success

failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure

Snip20150926_16.png

AFN解析相關(guān)

AFN在解析時候: 默認(rèn)解析的是JSON數(shù)據(jù).

我們通過他的一個內(nèi)部方法可以看到

Snip20150926_22.png

進入頭文件后可以看到他的默認(rèn)處理器為JSON處理器

Snip20150926_24.png

這樣的話,也就意味著,服務(wù)器返回的任何數(shù)據(jù)AFN內(nèi)部都會當(dāng)做JSON來處理

那么有時候服務(wù)器返回的是XML數(shù)據(jù)該怎么辦呢

如果想解析XML數(shù)據(jù),就需要手動把responseSerializer的值改掉,就可以了

Snip20150926_30.png

也就意味著這里的id responseObject,這里需要換做NSXMLParser *parser

Snip20150926_31.png

Snip20150926_32.png

那么有時候服務(wù)器返回的不是JSON也不是XML怎么辦呢

(比如文件的下載)

Snip20150926_33.png

這時,就要告訴AFN用最平常的數(shù)據(jù)來解析,服務(wù)器返回的是什么樣,就解析成什么樣即可

Snip20150926_34.png

服務(wù)器返回的數(shù)據(jù)解析的幾種方式

? ?// 解析服務(wù)器返回的普通數(shù)據(jù)(直接使用 *服務(wù)器本來返回的數(shù)據(jù)* 不作任何解析)

? ?mgr.responseSerializer = [AFJSONResponseSerializer serializer];

? ?// 解析服務(wù)器返回的XML數(shù)據(jù)

? ?mgr.responseSerializer = [AFXMLParserResponseSerializer serializer];

? ?// 解析服務(wù)器返回的JSON數(shù)據(jù) (默認(rèn)解析的是JSON可以不傳)

? ?mgr.responseSerializer = [AFJSONRequestSerializer serializer];

項目中的細(xì)節(jié)處理

有時候,可能當(dāng)用戶在點擊一個控制器的button在請求數(shù)據(jù)時候,會遇到網(wǎng)速慢,返回的數(shù)據(jù)特別慢,用戶可能會等的不耐煩,然后退掉當(dāng)前的控制器,但是這個請求是還存在著的,一旦請求返回,項目一定會崩潰.那么這種情況該怎么處理呢?

遇到這樣的情況,可以先把AFNHTTPSessionManger做一個屬性

@property(nonatomic, strong)AFNHTTPSessionManger *manger

將所有的發(fā)請求的地方都用成

// 如果這樣使用AFN,會把所有的請求都放入`manger.operationQueue`

self.manger POST/ GET

在- (void)dealloc方法中調(diào)用

// 取消所有任務(wù)

self.manger.operationQueue cancelAllOperations

? 著作權(quán)歸作者所有

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容