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)。