XMNetworking源碼閱讀學(xué)習(xí)

閑話不說了,今天來學(xué)習(xí)XcodeMen team的輕量級網(wǎng)絡(luò)庫XMNetworking

前陣子看源碼的時候,還是有點懵逼降瞳,自動昨天自己畫了思維導(dǎo)圖昔瞧,對網(wǎng)絡(luò)層的結(jié)構(gòu)分析了一下吟吝,今天再來看菱父,發(fā)現(xiàn)就豁然開朗了,感覺挺好的

XMConst 文件

一個定義全局文件變量文件,用結(jié)構(gòu)體定義了上傳浙宜、下載官辽、普通三種請求方式,6種請求方法粟瞬,3種請求序列化的方式同仆,4種回應(yīng)序列化的方式,三大類請求block(單個請求裙品、批量請求俗批、鏈?zhǔn)秸埱螅┮约耙粋€用來對請求回應(yīng)做處理的通用block,這應(yīng)該都是好理解的清酥。

XMRequest

XMRequest文件定義了XMRequest扶镀、XMBatchRequest蕴侣、XMChainRequest焰轻、XMUploadFormData四個類。

XMRequest 主要是提供請求的配置信息昆雀,也就是請求方法辱志、頭部、URL狞膘、請求和回應(yīng)序列化方式揩懒、超時時間等,還有另外幾個 readonly 修飾的block類型屬性挽封,這幾個block會在請求落地時候調(diào)用并返回業(yè)務(wù)數(shù)據(jù)已球。還有用語上傳數(shù)據(jù)的 uploadFormDatas 屬性,這個屬性規(guī)定了數(shù)組里的對象必須是uploadFormDatas 對象辅愿。還提供了幾個快速添加 uploadFormData的方法

XMBatchRequest智亮、XMChainRequest 并沒有使用繼承的方式,而是采用了組合点待。這兩個請求類通過持有XMRequest 對象作為屬性來獲得XMRequest對象的特征阔蛉,同時又可以自己衍生自己的特性。

XMUploadFormData為上傳請求的數(shù)據(jù)對象癞埠,并提供了多個類方法來創(chuàng)建新對象
整體來說状原,XMRequest文件提供的都是請求起飛的配置。

XMCenter

XMCenter文件定義了兩個類苗踪,分別是XMCenter和XMConfig颠区。
XMConfig類是XMCenter的配置類,而這些XMCenter配置信息通铲,又被間接提供到了request手里毕莱。

XMCenter類是整個框架的核心類,并且是個單例類。將通過請求的流程來分析源碼央串。
1磨澡、 - (void)setupConfig:(void(^)(XMConfig *config))block;
方法提供的config對象完成XMCenter的基本配置信息,這樣XMCenter單例對象將能直接使用這些配置。
2质和、 - (void)setResponseProcessBlock:(XMCenterResponseProcessBlock)block;
這個方法將用來處理返回的response稳摄,注意,這個block會在返回成功之前調(diào)用饲宿,我們可以通過這個block來處理請求成功厦酬,但是業(yè)務(wù)出現(xiàn)錯誤的情況,并且創(chuàng)建一個NSError實例傳遞給block瘫想,這樣在回調(diào)的block中仗阅,就直接走 FailureBlock,而不走SuccessBlock。也就是劫持response国夜,主動改變response走向减噪。
3、接下來就是一連串的便利請求發(fā)起方法车吹,但這些請求發(fā)起方法的下一層筹裕,就是參數(shù)最后的那個方法,也就是這個

- (NSUInteger)sendRequest:(XMRequestConfigBlock)configBlock
           onProgress:(nullable XMProgressBlock)progressBlock
            onSuccess:(nullable XMSuccessBlock)successBlock
            onFailure:(nullable XMFailureBlock)failureBlock
           onFinished:(nullable XMFinishedBlock)finishedBlock;

其余調(diào)起請求的方法窄驹,只是在這個方法上封裝了一層朝卒,并且固定了一些參數(shù),所以叫做便利方法乐埠。這個方法的實現(xiàn)如下

    XMRequest *request = [XMRequest request];
    XM_SAFE_BLOCK(configBlock, request);
    [self xm_processRequest:request onProgress:progressBlock onSuccess:successBlock onFailure:failureBlock onFinished:finishedBlock];
    return [self xm_sendRequest:request];

這個方法的實現(xiàn)了抗斤,生成了一個XMRequest實例request,并且通過XM_SAFE_BLOCK(configBlock, request);調(diào)用configBlock(這個是request的配置block丈咐,不要別錯看成XMcenter)瑞眼,將調(diào)起這個接口時候,配置的request信息(接口名字扯罐、請求方法负拟、參數(shù)等),填充到這request實例上來歹河。
4掩浙、再接下來就是通過為接口調(diào)起時配置的request做修飾,可能是新的參數(shù)秸歧、Header厨姚,URL等這些。
5键菱、處理完了request谬墙,那就是帶著request起飛了,也就是這個方法:
- (NSUInteger)xm_sendRequest:(XMRequest *)request 這個方法的實現(xiàn),將調(diào)用另外 XMEngine 來實現(xiàn)真正的起飛拭抬。并且通過block來接收回調(diào)處理部默。返回值將和對應(yīng)的請求task相互綁定,用于取消請求的操作造虎。
6傅蹂、回調(diào)方法有成功和失敗兩種。但在執(zhí)行回調(diào)時候算凿,是在一個私有線程份蝴,也就是XCenter自己的線程種callbackQueue。并且失敗的回調(diào)還有機(jī)會再次讓request起飛氓轰。
7婚夫、回調(diào)函數(shù)之行完成之后,就需要清理回調(diào)的block署鸡,回調(diào)的block是和request成員案糙,所有需要調(diào)用request的 - (void)cleanCallbackBlocks方法,置空與回調(diào)相關(guān)block(successBlock ;failureBlock ; finishedBlock ;progressBlock 储玫。
8侍筛、鏈?zhǔn)秸埱蠛团空埱螅^程都差不多撒穷,只在請求發(fā)起時候稍有差別。

整個流程差不多這樣了裆熙,在看看代碼端礼,應(yīng)該是沒問題了。并且入录,作者的注釋本來還有使用方法也寫得很清楚了蛤奥。

XMEngine

XMEngine是請求的發(fā)起者,它的下層是依賴于AFNetworking僚稿。并且凡桥,也是一個單例類。
這里應(yīng)該是延續(xù)上面的第5步操作:
5.1 XMEngine對象拿到request對象蚀同,通過request的屬性缅刽,確認(rèn)請求方式是上傳、下載還是普通請求蠢络、請求方法衰猛、序列化方式、超時時間刹孔、業(yè)務(wù)參數(shù)以及全局參數(shù)(Header啡省、agent等),并使用AFHTTPRequestSerializer 的實例對象 生成NSMutableURLRequest類型的URLRequest。如果出現(xiàn)序列化失敗卦睹,那么將會直接進(jìn)入失敗的回調(diào)函數(shù)中畦戒。(作者這里處理序列化失敗回調(diào)時候,使用了一個異步線程)
5.2 調(diào)用AFNetkworking 的sessionManager 并且請求飛起來结序。這其中兢交,通過objc的runtime的 關(guān)聯(lián)對象方法OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy) 給起飛的請求task將request綁定到了task,算是添加了一個屬性吧笼痹。
5.3 通過task的identifier配喳,從sessionManager的tasks數(shù)組中,找到對應(yīng)identifier的task凳干,進(jìn)行改任務(wù)的取消操作晴裹。這個過程,這這通過 信號量(dispatch_semaphore_...)機(jī)制做了線程安全的處理救赐。

總結(jié)

對這個輕量級的網(wǎng)絡(luò)框架分析就差不多這樣了涧团,總結(jié)一下自己對這個框架的認(rèn)識:
1、這個框架屬于集中型的設(shè)計经磅,請求都是通過XMCenter進(jìn)行調(diào)度
2泌绣、大量使用了block(簡直廢話??),所以有時候看起來的確有點跳,習(xí)慣就好了
3预厌、框架也是組織request阿迈,request起飛,response落地三步走轧叽,所以從這個方向去理解苗沧,就容易多了
4、感謝作者的貢獻(xiàn)炭晒,看源碼還是好處多多待逞,學(xué)習(xí)了!
5网严、有理解錯誤的地方识樱,歡迎指正

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市震束,隨后出現(xiàn)的幾起案子怜庸,更是在濱河造成了極大的恐慌,老刑警劉巖驴一,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件休雌,死亡現(xiàn)場離奇詭異,居然都是意外死亡肝断,警方通過查閱死者的電腦和手機(jī)杈曲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門驰凛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人担扑,你說我怎么就攤上這事恰响。” “怎么了涌献?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵胚宦,是天一觀的道長。 經(jīng)常有香客問我燕垃,道長枢劝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任卜壕,我火速辦了婚禮您旁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘轴捎。我一直安慰自己鹤盒,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布侦副。 她就那樣靜靜地躺著侦锯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秦驯。 梳的紋絲不亂的頭發(fā)上尺碰,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機(jī)與錄音汇竭,去河邊找鬼葱蝗。 笑死,一個胖子當(dāng)著我的面吹牛细燎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播皂甘,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼玻驻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了偿枕?” 一聲冷哼從身側(cè)響起璧瞬,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渐夸,沒想到半個月后嗤锉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡墓塌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年瘟忱,在試婚紗的時候發(fā)現(xiàn)自己被綠了奥额。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡访诱,死狀恐怖垫挨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情触菜,我是刑警寧澤九榔,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站涡相,受9級特大地震影響哲泊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜催蝗,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一切威、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧生逸,春花似錦牢屋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至遍尺,卻和暖如春截酷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背乾戏。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工迂苛, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鼓择。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓三幻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親呐能。 傳聞我的和親對象是個殘疾皇子念搬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)摆出,斷路器朗徊,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法偎漫,內(nèi)部類的語法爷恳,繼承相關(guān)的語法,異常的語法象踊,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,869評論 6 13
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,790評論 0 11
  • AFHTTPRequestOperationManager 網(wǎng)絡(luò)傳輸協(xié)議UDP温亲、TCP棚壁、Http、Socket铸豁、X...
    Carden閱讀 4,322評論 0 12