前言:在Swift慢慢趨向于穩(wěn)定且高效的時候憨琳,OC也隨著時間一點(diǎn)點(diǎn)的消逝椎侠,曾經(jīng)的諸多OC框架也都投向了Swift的懷抱姿染,而Swift對于框架的提升也逐漸的展露頭腳伐憾。
Alamofire作為AFNetworking的升級版勉痴,在網(wǎng)絡(luò)請求的框架中有著非常眾多的使用者,所以今天就來學(xué)習(xí)Alamofire框架中的response流程和常見的多表單上傳树肃。
response流程
response在Alamofire中扮演了什么角色蒸矛?
response直譯過來是反應(yīng)、響應(yīng)的胸嘴。在普通網(wǎng)絡(luò)請求中雏掠,我們是通過閉包或者代理方法來獲得數(shù)據(jù)請求請求的,這里來看一段普通請求的代碼劣像。
這是一段最簡單的請求乡话,沒有頭文件的設(shè)置。在閉包中返回了data耳奕,response绑青,error三個參數(shù)。那這里的response是什么呢屋群?
這里通過打印可以看到NSHTTPURLResponse的類闸婴,其實主體就是兩個字典,而NSHTTPURLResponse是繼承自NSURLResponse的類芍躏,屬性是來自于NSURLResponse邪乍。
response在這里是作為保存Url、請求的狀態(tài)和請求的頭信息存在的对竣,那Alamofire是否是同樣的作用呢庇楞?
追溯源碼開始
這里直接創(chuàng)建了response,是一個DataResponse柏肪,那這個DataResponse是不是在閉包中獲取到的呢姐刁,暫時還不得而知。這里先來看一下DataResponse是什么烦味。
這是一個保存信息的結(jié)構(gòu)體聂使。什么方法也沒有壁拉,聲明了一堆的屬性“匕校回頭看創(chuàng)建的response弃理,此時是保存信息。
保存的是什么信息呢屎蜓,這里self.request痘昌,self.response,self.data炬转,self.metrics辆苔,以及result都是什么呢?這里的self 指向了DataRequest扼劈,同樣來到DataRequest中
DataRequest類中只有一個data驻啤,來自于mutableData,其他的屬性呢荐吵?看繼承的關(guān)系骑冗,只能去DataRequest的父類中去尋找。在Request類中找到了其他的的屬性先煎。數(shù)據(jù)太多贼涩,這里就不截圖了∈硇可以看到一點(diǎn)的是遥倦,不管是data還是其他的屬性都是在這里聲明的。
看到這里似乎有一點(diǎn)明白了占锯,response是一個響應(yīng)的存儲類谊迄,保存了我們的url,返回的data烟央,以及error等屬性。
再接著向下走
-> self.eventMonitor?.request(self, didParseResponse: response)
肯定是看最后一個request的方法
這個時候肯定是需要了解清楚這個eventMonitor是什么
源碼中很清晰歪脏,這里是一個協(xié)議疑俭,定義了很多的方法。只需要找到是誰實現(xiàn)的這個協(xié)議就清楚了request方法究竟做了什么婿失。
再次跳轉(zhuǎn)钞艇,可以看到這個eventMonitor? 被添加進(jìn)入了一個monitors的數(shù)組中,這下就明白了豪硅,這個request的方法是監(jiān)控回調(diào)的哩照。
這里很清楚的看到并沒有使用session的閉包請求,那么請求的回調(diào)一定是發(fā)生在代理中的懒浮。
最開始的ruqest方法已經(jīng)開始了請求飘弧,那么就需要在URLSessionDataDelegate實現(xiàn)的代理中找到回調(diào)的方法
在這里我們就將請求到的數(shù)據(jù)寫入了對應(yīng)的response中去了识藤。
當(dāng)然在這里還沒有結(jié)束->??self.responseSerializerDidComplete 這一句就是將閉包追加到請求的狀態(tài)中。
當(dāng)請求成功的時候?qū)⒄埱蟮臓顟B(tài)修改為isFinished次伶,然后調(diào)用對應(yīng)外界的回調(diào)閉包痴昧,將請求的數(shù)據(jù)及請求的狀態(tài)以及請求的參數(shù)打包整理好的response,通過閉包回調(diào)出去冠王。
總結(jié)一下:Alamofire 采用了將請求和參數(shù)以及回調(diào)的閉包封裝為成為一個新的DataResponse赶撰,然后通過監(jiān)聽URLSessionDataDelegate代理中回調(diào)的方法,獲取到請求成功或失敗的數(shù)據(jù)柱彻,再將其添加到DataResponse中豪娜,最后通過保存的閉包將其返回,完成一個閉包返回所有數(shù)據(jù)的功能哟楷。