【swift源碼閱讀】Alamofire-Part2:SessionManager1

Alamofire推薦給開發(fā)者的調(diào)用層是位于source文件夾下最外層的Alamofire.swift文件投放,我們先從這里開始。

入口文件目錄位置

文件最開始的地方定義了一個URLConvertible的協(xié)議,里面只有一個asURL方法,返回一個URL類型覆履。后面可以看到對String究恤,URL和URLComponents都做了URLConvertible的拓展俭令。以下以String類型的拓展為例:

對String類型的URLConvertible拓展

可以看出這個方法只是利用對象自身來生成可用的URL,利用協(xié)議這種做法是為了實現(xiàn)多態(tài)部宿。

查看文件的屬性定義可以看到抄腔,下面還有一個URLRequestConvertible協(xié)議,定義了一個用來返回URLRequest的asURLRequest函數(shù)理张,由URLRequest實現(xiàn)拓展赫蛇。這個的目的與URLConvertible一樣,就不細(xì)說了雾叭。

Alamofire.swift中的協(xié)議與拓展

在URLRequestConvertible下面還有一個URLRequest的拓展悟耘,這里要注意一下。

URLRequest拓展

這個拓展中新定義了一個初始化方法织狐,真正需要注意的是第二個adapt函數(shù)暂幼,這個函數(shù)給予了開發(fā)者自己自己配置request的接口。adapter函數(shù)接收一個RequestAdapter的對象移迫,RequestAdapter實際上是一個協(xié)議旺嬉,這里就不截圖了,RequestAdapter在協(xié)議中定義了一個adapter函數(shù)厨埋,這個函數(shù)接收一個URLRequest對象邪媳,返回一個URLRequest對象。

當(dāng)我們想實現(xiàn)自定義的request的時候荡陷,傳入一個實現(xiàn)了RequestAdapter拓展的對象即可雨效。

接下來就是功能性的函數(shù)了,也是使用Alamofire主要調(diào)用的函數(shù)废赞,但是往下一看设易,你會發(fā)現(xiàn)這些函數(shù)全是這種畫風(fēng):

這里我們終于講到本文的重點了————SessionManager!

SessionManager是真正的管理者蛹头,所有Alamofire的外部調(diào)用都是調(diào)用SessionManager里的方法顿肺。接下里我們看一下SessionManager.swift文件里的內(nèi)容。

首先SessionManager里面定義了一個靜態(tài)的default實例渣蜗,進(jìn)行了configuration以及headers的一些基本定義屠尊。如果想對headers在原有基礎(chǔ)上進(jìn)行一些拓展的話,直接在這個文件里的defaultHTTPHeaders里面添加就可以了耕拷。

Alamofire的調(diào)用讼昆,實際上都是對SessionManager里的default實例的調(diào)用。

SessionManager里還有很多其他屬性以及初始化方法骚烧,這里都暫且不表浸赫,其中有一些后面有涉及的時候會講解闰围,有興趣的朋友可以去看一下。這里我們直接把目光鎖定在實例方法上既峡。SessionManager主要有三套方法:request, download以及upload羡榴。


request

根據(jù)前一章NSURLSession基礎(chǔ),我們知道运敢,所有的利用URLSession進(jìn)行網(wǎng)絡(luò)請求的本質(zhì)是啟動URLSessionTask校仑。所以可以看到所有的方法最后都會走到DataRequest.resume()。request系列函數(shù)共有兩個公有函數(shù)传惠,如下迄沫。

request公有函數(shù)

可以看出,第一個request方法卦方,實際上是對request(_ urlRequest:URLRequestConvertible)的二次封裝羊瘩,利用調(diào)用者傳入的參數(shù)生成URLRequest后,調(diào)用request(_ urlRequest:URLRequestConvertible)盼砍。

DataRequest.Requestable是定義在DataRequest中的一個結(jié)構(gòu)體困后,這個機(jī)構(gòu)體擁有一個URLRequest變量和一個返回URLSessionTask的task函數(shù)。

于是我們可以看出衬廷,在request(_ urlRequest:URLRequestConvertible)中,先利用傳入的參數(shù)生成task汽绢,再利用這個task生成request吗跋,將這個request加入到SessionDelegate中,然后檢查startRequestsImmediately變量(默認(rèn)為true)宁昭,如果為true跌宛,調(diào)用request.resume()啟動請求。

這里有人可能有疑惑了积仗,既然傳入的參數(shù)調(diào)用asURLRequest方法時就已經(jīng)返回了一個request疆拘,為什么還要用task重新生成一個呢?為什么是由request調(diào)用resume函數(shù)而不是task呢寂曹?

我們先來看一下用task生成request的函數(shù)定義哎迄,這個函數(shù)定義在Request類中,是Alamofire中所有request的總基類隆圆。

從上圖可以看出漱挚,利用這個函數(shù)生成的request根據(jù)傳入的task初始化了taskDelegate。只有這種request加入sessionDelegate才有意義渺氧,可以通過sessionDelegate來處理請求的回調(diào)旨涝。這也是為什么要用task重新生成一個request來加入delegate的原因。

那么為什么用request來調(diào)用resume而不是task呢侣背?

實際上request是沒有resume函數(shù)的白华,這里的resume是被封裝在Request中的自定義函數(shù)慨默。

自定義的resume函數(shù)

在resume函數(shù)中會檢查request的task是否被掛起,如果沒有就調(diào)用task的resume函數(shù)弧腥。這里比較有意思的是任務(wù)開啟后會發(fā)送一個通知厦取,但你會發(fā)現(xiàn)在Alamofire中沒有任何地方接收這個通知,這個通知其實是發(fā)送給第三方調(diào)用者的鸟赫。如果你有任務(wù)開啟后要馬上執(zhí)行的動作蒜胖,你就可以在代碼中接收這個通知。在Alamofire的高級使用中我們會講到這里抛蚤。

關(guān)于Request和SessionDelegate的代碼台谢,我們會在以后進(jìn)行閱讀。下一篇將講解SessionManager中的upload與download方法岁经。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末朋沮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子缀壤,更是在濱河造成了極大的恐慌樊拓,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件塘慕,死亡現(xiàn)場離奇詭異筋夏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)图呢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門条篷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛤织,你說我怎么就攤上這事赴叹。” “怎么了指蚜?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵乞巧,是天一觀的道長。 經(jīng)常有香客問我摊鸡,道長绽媒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任免猾,我火速辦了婚禮些椒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘掸刊。我一直安慰自己免糕,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著石窑,像睡著了一般牌芋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上松逊,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天躺屁,我揣著相機(jī)與錄音,去河邊找鬼经宏。 笑死犀暑,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的烁兰。 我是一名探鬼主播耐亏,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼沪斟!你這毒婦竟也來了广辰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤主之,失蹤者是張志新(化名)和其女友劉穎择吊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體槽奕,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡几睛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了粤攒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片所森。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖琼讽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洪唐,我是刑警寧澤钻蹬,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站凭需,受9級特大地震影響问欠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜粒蜈,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一顺献、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枯怖,春花似錦注整、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寿冕。三九已至,卻和暖如春椒袍,著一層夾襖步出監(jiān)牢的瞬間驼唱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工驹暑, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留玫恳,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓优俘,卻偏偏與公主長得像京办,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子兼吓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

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