Alamofire原始碼分析(一)---Alamofire.swift

weixin_33936401發表於2017-07-10

Alamofire.swift為網路請求的呼叫提供了介面,並提供了一些工具方法

1.兩個協議URLConvertible和URLRequestConvertible

這兩個協議提供了一些工具方法,方便其他型別轉換為URL或URLRequest型別,以便發請求使用。

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

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

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

注意到函式的返回值是有一個關鍵字throws,表示一個函式可以丟擲錯誤。一個標有throws關鍵字的函式被稱作throwing函式。這個函式指明瞭返回值型別,因此throws關鍵詞需要寫在箭頭(->)的前面。throwing函式可以在內部丟擲錯誤,並將錯誤傳遞到函式被呼叫的地方。

看String的方法實現

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)方法出現異常,就會丟擲AFError錯誤。因為這個方法可能會丟擲異常,所以在呼叫時前面加try關鍵字,最終通過包裹在外層的Do-Catch來捕獲到異常進一步處理。

比如用一個空字串來建立一個request,Alamofire.request("") ,呼叫會走到如下這段程式碼

    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方法建立時會呼叫到String的asURL方法並丟擲AFError異常,這時程式碼就會走到catch這裡。

2.框架入口

這裡提供request,donwload,upload的方法。來建立獲取資料,下載,上傳的request。他們提供不同引數初始化方法,並都通過呼叫SessionManager.default來建立。然後通過呼叫ResponseSerialization裡面的responseString方法來傳送請求並處理。

    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 的快取,協議,cookie,以及證書策略(credential policy),甚至跨程式共享這些資訊。這將允許程式和網路基礎框架之間相互獨立,不會發生干擾。每個 NSURLSession 物件都由一個 NSURLSessionConfiguration 物件來進行初始化,後者指定了剛才提到的那些策略以及一些用來增強移動裝置上效能的新選項。

NSURLSession 中另一大塊就是 session task。它負責處理資料的載入以及檔案和資料在客戶端與服務端之間的上傳和下載。NSURLSessionTask 與 NSURLConnection 最大的相似之處在於它也負責資料的載入,最大的不同之處在於所有的 task 共享其創造者 NSURLSession 這一公共委託者(common delegate)。

相關文章