Alamofire推薦給開發(fā)者的調(diào)用層是位于source文件夾下最外層的Alamofire.swift文件投放,我們先從這里開始。
文件最開始的地方定義了一個URLConvertible的協(xié)議,里面只有一個asURL方法,返回一個URL類型覆履。后面可以看到對String究恤,URL和URLComponents都做了URLConvertible的拓展俭令。以下以String類型的拓展為例:
可以看出這個方法只是利用對象自身來生成可用的URL,利用協(xié)議這種做法是為了實現(xiàn)多態(tài)部宿。
查看文件的屬性定義可以看到抄腔,下面還有一個URLRequestConvertible協(xié)議,定義了一個用來返回URLRequest的asURLRequest函數(shù)理张,由URLRequest實現(xiàn)拓展赫蛇。這個的目的與URLConvertible一樣,就不細(xì)說了雾叭。
在URLRequestConvertible下面還有一個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羡榴。
根據(jù)前一章NSURLSession基礎(chǔ),我們知道运敢,所有的利用URLSession進(jìn)行網(wǎng)絡(luò)請求的本質(zhì)是啟動URLSessionTask校仑。所以可以看到所有的方法最后都會走到DataRequest.resume()。request系列函數(shù)共有兩個公有函數(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ù)中會檢查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方法岁经。