22 - AFNetworking的原理與基本使用

  • 全稱是AFNetworking
  • 雖然運(yùn)行效率沒有ASI高,但是使用比ASI簡單
  • 是對NSURLConnection和NSURLSession的各自的一層包裝

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

  • AFN內(nèi)部開了一條專門用來訪問網(wǎng)絡(luò)請求的線程
  • 在這個(gè)開線程的方法中,他把方法和dispatch_once都用static修飾了下
  • 以保證這個(gè)方法的安全性以及只開辟一塊內(nèi)存空間,而且保證他線程不死
  • 在這個(gè)方法中他會調(diào)用另一個(gè)網(wǎng)絡(luò)請求入口的方法
  • 在這個(gè)入口方法中他會創(chuàng)建一個(gè)RunLoop
  • 然后添加一個(gè)NSMachPort端口,目的是為了讓他里面有Source(因?yàn)橛辛薙ource的RunLoop才能真正跑起來)
  • 然后啟動(dòng)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
  1. 參數(shù)是不用拼接的,AFN內(nèi)部會幫你遍歷字典然后幫你拼接完成,只需把參數(shù)傳入即可.
  2. 請求成功會來到第一個(gè)block,id responseObject這個(gè)參數(shù),會自動(dòng)幫你從服務(wù)器得到的JSON數(shù)據(jù)轉(zhuǎn)為字典或者數(shù)組(用id就是因?yàn)椴灰欢ǚ祷氐氖鞘裁磾?shù)據(jù).所以要用到id);他的內(nèi)部無非也就是一個(gè)Request對象
  3. NSError *error返回的是錯(cuò)誤信息
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在解析時(shí)候: 默認(rèn)解析的是JSON數(shù)據(jù).
  • 我們通過他的一個(gè)內(nèi)部方法可以看到


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


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

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

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

    Snip20150926_30.png

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

    Snip20150926_31.png

Snip20150926_32.png

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

(比如文件的下載)
Snip20150926_33.png
  • 這時(shí),就要告訴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];

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

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

  1. 遇到這樣的情況,可以先把AFNHTTPSessionManger做一個(gè)屬性
@property(nonatomic, strong)AFNHTTPSessionManger *manger
  1. 將所有的發(fā)請求的地方都用成
// 如果這樣使用AFN,會把所有的請求都放入`manger.operationQueue`
self.manger POST/ GET
  1. - (void)dealloc方法中調(diào)用
// 取消所有任務(wù)
self.manger.operationQueue cancelAllOperations
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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