iOS AFNetworking 3.x 源碼分析(筆記)

用了這么久的AFNetworking,現(xiàn)在終于有時(shí)間把它的源碼實(shí)現(xiàn)讀了一遍狐肢。不跟你多嗶嗶端辱,直入正題:這里以Http的“POST”請(qǐng)求網(wǎng)絡(luò)的方式來(lái)簡(jiǎn)單分析一下醋火。

首先介紹一下AFNetworking的文件大致結(jié)構(gòu),如下圖跟網(wǎng)絡(luò)請(qǐng)求相關(guān)的文件就是四部分(NSURLSession潜圃、Reachbaility缸棵、Security、Serialization)

file

一個(gè)網(wǎng)絡(luò)請(qǐng)求以調(diào)用AFHTTPSessionManager中的如下方法作為入口:

method_begin

可以看到內(nèi)部實(shí)現(xiàn)是調(diào)用了另一個(gè)方法來(lái)返回dataTask谭期,然后調(diào)用[dataTask resume];方法來(lái)開(kāi)始一個(gè)網(wǎng)絡(luò)請(qǐng)求(因?yàn)橐粋€(gè)dataTask默認(rèn)是掛起狀態(tài)堵第,需要手動(dòng)調(diào)用resume方法來(lái)啟動(dòng))。這里還可以看到dataTask是作為返回值返回給調(diào)用者隧出,這將非常有用踏志,因?yàn)槲覀兛梢阅玫絛ataTask,然后對(duì)它進(jìn)行一系列操作(暫停、取消等),有很高的自定義性胀瞪。這里舉一個(gè)應(yīng)用dataTask的例子:在做即時(shí)搜索(就是輸入框的內(nèi)容改變的時(shí)候就去觸發(fā)一個(gè)網(wǎng)絡(luò)請(qǐng)求针余,搜索一次)的時(shí)候,在我們輸入的速度很快的時(shí)候凄诞,前一次的網(wǎng)絡(luò)請(qǐng)求我們就可以通過(guò)dataTask來(lái)取消掉圆雁,使性能更優(yōu);接下來(lái)我們進(jìn)一步深入探索AFNetworking是怎么實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求的帆谍。如下圖:(兩張圖展示的是一個(gè)方法)


通過(guò)self.requestSerializer獲得request 這個(gè)方法里有一個(gè)亮點(diǎn)伪朽,就是通過(guò)kvo和kvc的技術(shù)為request動(dòng)態(tài)設(shè)置屬性值(allowsCellularAccess、cachePolicy汛蝙、HTTPShouldHandleCookies烈涮、HTTPShouldUsePipelining朴肺、networkServiceType、timeoutInterval)坚洽。感興趣的可以去仔細(xì)研究下這樣設(shè)計(jì)的好處宇挫。接下來(lái)我們看獲得dataTask和執(zhí)行回調(diào)的重要方法的實(shí)現(xiàn),如下圖:

由于AFHTTPSessionManager是繼承于AFURLSessionManager的,所以此方法是在AFURLSessionManager中實(shí)現(xiàn)的(同學(xué)們可以思考下這種設(shè)計(jì)的好處)酪术。接下來(lái)我們來(lái)看看為dataTask設(shè)置代理的方法到底做了什么,看下圖:

上圖中的方法為每個(gè)dataTask都設(shè)置了對(duì)應(yīng)的代理器瘪,代理的作用是:當(dāng)請(qǐng)求結(jié)束的時(shí)候根據(jù)dataTask找到對(duì)應(yīng)的delegate,然后由delegate來(lái)執(zhí)行完成回調(diào)或者失敗的回調(diào)绘雁。需要注意的是這里的delegate不是我們平常寫(xiě)代碼時(shí)候的那種屬性代理橡疼,這兒的‘delegate’只是跟代理的作用很像,所以叫做delegate庐舟,其實(shí)只是一種一一對(duì)應(yīng)的形式欣除,把dataTask對(duì)用的各種對(duì)調(diào)賦值給了‘delegate’,然后‘delegate’可以來(lái)幫助dataTask執(zhí)行回調(diào)(同學(xué)們可以思考下‘為什么不直接寫(xiě)一個(gè)子類(lèi)集成于dataTask然后為其添加一個(gè)代理屬性挪略,來(lái)實(shí)現(xiàn)真正的意義上的代理呢历帚?’)。到這里創(chuàng)建和配置dataTask已經(jīng)完成杠娱,接下來(lái)我們來(lái)看看請(qǐng)求完成的時(shí)候挽牢,AFN是怎么回調(diào)的,請(qǐng)看下圖:

從圖中可以看到正如我們上面提到的摊求,是根據(jù)delegate來(lái)完成回調(diào)的禽拔,讓我們接著看看[delegate URLSession:session task:task didCompleteWithError:error];這個(gè)方法里做了什么?由于方法中代碼太長(zhǎng)室叉,截圖不好截睹栖,因此下圖中只是請(qǐng)求沒(méi)有出錯(cuò)的情況下執(zhí)行回調(diào)的代碼:


以上便是我對(duì)AFNetworking的簡(jiǎn)單分析,可能有些理解不對(duì)之處茧痕,請(qǐng)大神指正R袄础!踪旷!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末曼氛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子埃脏,更是在濱河造成了極大的恐慌搪锣,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彩掐,死亡現(xiàn)場(chǎng)離奇詭異构舟,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)狗超,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)弹澎,“玉大人,你說(shuō)我怎么就攤上這事努咐】噍铮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵渗稍,是天一觀的道長(zhǎng)佩迟。 經(jīng)常有香客問(wèn)我,道長(zhǎng)竿屹,這世上最難降的妖魔是什么报强? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮拱燃,結(jié)果婚禮上秉溉,老公的妹妹穿的比我還像新娘。我一直安慰自己碗誉,他們只是感情好召嘶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著哮缺,像睡著了一般弄跌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蝴蜓,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天碟绑,我揣著相機(jī)與錄音,去河邊找鬼茎匠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛押袍,可吹牛的內(nèi)容都是我干的诵冒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼谊惭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼汽馋!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起圈盔,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤豹芯,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后驱敲,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體铁蹈,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年众眨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了握牧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片容诬。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖沿腰,靈堂內(nèi)的尸體忽然破棺而出览徒,到底是詐尸還是另有隱情,我是刑警寧澤颂龙,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布习蓬,位于F島的核電站,受9級(jí)特大地震影響措嵌,放射性物質(zhì)發(fā)生泄漏躲叼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一铅匹、第九天 我趴在偏房一處隱蔽的房頂上張望押赊。 院中可真熱鬧,春花似錦包斑、人聲如沸流礁。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)神帅。三九已至,卻和暖如春萌抵,著一層夾襖步出監(jiān)牢的瞬間找御,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工绍填, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留霎桅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓讨永,卻偏偏與公主長(zhǎng)得像滔驶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子卿闹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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