22 - 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請求
  • 解析服務器的響應數(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. 請求成功會來到第一個block,id responseObject這個參數(shù),會自動幫你從服務器得到的JSON數(shù)據(jù)轉(zhuǎn)為字典或者數(shù)組(用id就是因為不一定返回的是什么數(shù)據(jù).所以要用到id);他的內(nèi)部無非也就是一個Request對象
  3. 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請求
  • 解析服務器的響應數(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在解析時候: 默認解析的是JSON數(shù)據(jù).
  • 我們通過他的一個內(nèi)部方法可以看到


    Snip20150926_22.png
  • 進入頭文件后可以看到他的默認處理器為JSON處理器


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

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

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

    Snip20150926_30.png

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

    Snip20150926_31.png

Snip20150926_32.png

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

(比如文件的下載)
Snip20150926_33.png
  • 這時,就要告訴AFN用最平常的數(shù)據(jù)來解析,服務器返回的是什么樣,就解析成什么樣即可


    Snip20150926_34.png

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


    // 解析服務器返回的普通數(shù)據(jù)(直接使用 *服務器本來返回的數(shù)據(jù)* 不作任何解析)
    mgr.responseSerializer = [AFJSONResponseSerializer serializer];

    // 解析服務器返回的XML數(shù)據(jù)
    mgr.responseSerializer = [AFXMLParserResponseSerializer serializer];
    
    // 解析服務器返回的JSON數(shù)據(jù) (默認解析的是JSON可以不傳)
    mgr.responseSerializer = [AFJSONRequestSerializer serializer];

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

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

  1. 遇到這樣的情況,可以先把AFNHTTPSessionManger做一個屬性
@property(nonatomic, strong)AFNHTTPSessionManger *manger
  1. 將所有的發(fā)請求的地方都用成
// 如果這樣使用AFN,會把所有的請求都放入`manger.operationQueue`
self.manger POST/ GET
  1. - (void)dealloc方法中調(diào)用
// 取消所有任務
self.manger.operationQueue cancelAllOperations
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末讥巡,一起剝皮案震驚了整個濱河市捏鱼,隨后出現(xiàn)的幾起案子伙菜,更是在濱河造成了極大的恐慌受楼,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件网严,死亡現(xiàn)場離奇詭異识樱,居然都是意外死亡,警方通過查閱死者的電腦和手機震束,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門怜庸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人垢村,你說我怎么就攤上這事割疾。” “怎么了肝断?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驰凛。 經(jīng)常有香客問我胸懈,道長,這世上最難降的妖魔是什么恰响? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任趣钱,我火速辦了婚禮,結(jié)果婚禮上胚宦,老公的妹妹穿的比我還像新娘首有。我一直安慰自己,他們只是感情好枢劝,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布井联。 她就那樣靜靜地躺著,像睡著了一般您旁。 火紅的嫁衣襯著肌膚如雪烙常。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天鹤盒,我揣著相機與錄音蚕脏,去河邊找鬼侦副。 笑死,一個胖子當著我的面吹牛驼鞭,可吹牛的內(nèi)容都是我干的秦驯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼挣棕,長吁一口氣:“原來是場噩夢啊……” “哼译隘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起穴张,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤细燎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后皂甘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玻驻,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年偿枕,在試婚紗的時候發(fā)現(xiàn)自己被綠了璧瞬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡渐夸,死狀恐怖嗤锉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情墓塌,我是刑警寧澤瘟忱,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站苫幢,受9級特大地震影響访诱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜韩肝,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一触菜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哀峻,春花似錦涡相、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至育特,卻和暖如春生逸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工槽袄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留烙无,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓遍尺,卻偏偏與公主長得像截酷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子乾戏,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容