Alamofire源碼分析(一)---Alamofire.swift

Alamofire.swift為網(wǎng)絡請求的調(diào)用提供了接口,并提供了一些工具方法

1.兩個協(xié)議URLConvertible和URLRequestConvertible

這兩個協(xié)議提供了一些工具方法,方便其他類型轉(zhuǎn)換為URL或URLRequest類型,以便發(fā)請求使用。

public protocol URLConvertible {
    func asURL() throws -> URL
}

public protocol URLRequestConvertible {
    func asURLRequest() throws -> URLRequest
}

這兩個協(xié)議分別定義了生成對應類型的方法。讓其他類型來繼承這個協(xié)議,實現(xiàn)此方法。與寫oc的習慣不同,之前寫oc時一般直接給類加category,而這里使用的是定義protocol并讓需要擴展的類型繼承該協(xié)議的方法。

注意到函數(shù)的返回值是有一個關(guān)鍵字throws,表示一個函數(shù)可以拋出錯誤。一個標有throws關(guān)鍵字的函數(shù)被稱作throwing函數(shù)。這個函數(shù)指明了返回值類型,因此throws關(guān)鍵詞需要寫在箭頭(->)的前面。throwing函數(shù)可以在內(nèi)部拋出錯誤,并將錯誤傳遞到函數(shù)被調(diào)用的地方。

看String的方法實現(xiàn)

extension String: URLConvertible {
    public func asURL() throws -> URL {
        guard let url = URL(string: self) else { throw AFError.invalidURL(url: self) }
        return url
    }
}

如果URL(string: self)方法出現(xiàn)異常,就會拋出AFError錯誤。因為這個方法可能會拋出異常,所以在調(diào)用時前面加try關(guān)鍵字,最終通過包裹在外層的Do-Catch來捕獲到異常進一步處理。

比如用一個空字符串來創(chuàng)建一個request,Alamofire.request("") ,調(diào)用會走到如下這段代碼

    do {
       originalRequest = try URLRequest(url: url, method: method, headers: headers)
       let encodedURLRequest = try encoding.encode(originalRequest!, with: parameters)
       return request(encodedURLRequest)
   } catch {
       return request(originalRequest, failedWith: error)
   }

URLRequest方法創(chuàng)建時會調(diào)用到String的asURL方法并拋出AFError異常,這時代碼就會走到catch這里。

2.框架入口

這里提供request,donwload,upload的方法。來創(chuàng)建獲取數(shù)據(jù),下載,上傳的request。他們提供不同參數(shù)初始化方法,并都通過調(diào)用SessionManager.default來創(chuàng)建。然后通過調(diào)用ResponseSerialization里面的responseString方法來發(fā)送請求并處理。

    Alamofire.request("https://httpbin.org/get").responseString{ response in
       print("result = \(response.result)");
       print("response = \(String(describing: response.response))");
   }

3.URLSession基礎

iOS7之前的NSURLConnection 替換成了 NSURLSession、NSURLSessionConfiguration 以及 NSURLSessionTask 的 3 個子類:NSURLSessionDataTask,NSURLSessionUploadTask,NSURLSessionDownloadTask。

與 NSURLConnection 相比,NSURLsession 最直接的改進就是可以配置每個 session 的緩存,協(xié)議,cookie,以及證書策略(credential policy),甚至跨程序共享這些信息。這將允許程序和網(wǎng)絡基礎框架之間相互獨立,不會發(fā)生干擾。每個 NSURLSession 對象都由一個 NSURLSessionConfiguration 對象來進行初始化,后者指定了剛才提到的那些策略以及一些用來增強移動設備上性能的新選項。

NSURLSession 中另一大塊就是 session task。它負責處理數(shù)據(jù)的加載以及文件和數(shù)據(jù)在客戶端與服務端之間的上傳和下載。NSURLSessionTask 與 NSURLConnection 最大的相似之處在于它也負責數(shù)據(jù)的加載,最大的不同之處在于所有的 task 共享其創(chuàng)造者 NSURLSession 這一公共委托者(common delegate)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,699評論 19 139
  • 1. Alamofire結(jié)構(gòu) Alamofire全部實現(xiàn)共有17個文件組成,如下: Alamofire有五模塊組成...
    繁華落盡丶lee閱讀 2,083評論 0 3
  • URLSession NSURLSession是iOS7中新的網(wǎng)絡接口,與NSURLConnection是并列的。...
    JonesCxy閱讀 1,768評論 0 9
  • Alamofire源碼解讀 AFNetworking的作者Matt Thompson 提出了一個新的類似AFNet...
    spicyShrimp閱讀 1,253評論 0 3
  • 今天是中秋節(jié),休息日,除了睡懶覺,還把《老九門》看完了。一部連副官都那么帥的電視??!讓我這個外貌協(xié)會會長一飽眼福。...
    木木日記2020閱讀 215評論 0 0

友情鏈接更多精彩內(nèi)容