在這前,已經介紹並學習過AFNetworking源碼了,現在通過閱讀學習Alamofire最新源碼同時,學習swift 3.0這門語言,雖然swift programming language已經看過,但是沒有實際例子語法性的東西真的很容易就忘記。這里會簡單紹Alamofire最新源碼的架構,並且學習swift 3.0這門語言,透過Alamofire學習優秀的swift 3.0用法並記錄,加深記憶。
Alamofire 簡述
其實alamofire跟AFNetworking做的事情是一樣的,所以會非常想似,架構,思路等,所以細節實現並不會很深入寫。大概的類結構及關系如下:
1、Alamofire是用來提供對外接口的,最終調用都被接到SessionManager,SessionManager依賴ParameterEncoding把參數,數據等生成請求,再依賴SessionDelegate生成sessionTask,每個task都與TaskDelegate成對的包裝在Request里。服務器數據的返回會很到SessionDelegate,到被分發到對應的taskDelegate。當完成時,就會調用Request預設置的block任務。前依賴ResponseSerializer對數據進行返序列化,再通過block回調給使用者。以下為它的流程圖:
說明:帶括號里面的並不是真正的函數調用,只是一些說明,為了概括一下邏輯,省略了一些細節。
首先要看到的是它的對外接口Alamofire.swift,在這里面定義了很多網絡請求的接口。
1、swift中會加上了OC沒有的命名空間,很好的解決了命字沖突的問題。
外部調用接口時我們可以看到是這樣的
let urlString = "https://httpbin.org/get" // When let request = Alamofire.request(urlString, parameters: ["foo": "bar"])
它所有接口都是交給SessionManager了。
以下是一個例子
public func request( _ url: URLConvertible, method: HTTPMethod = .get, parameters: Parameters? = nil, encoding: ParameterEncoding = URLEncoding.default, headers: HTTPHeaders? = nil) -> DataRequest { return SessionManager.default.request( url, method: method, parameters: parameters, encoding: encoding, headers: headers ) }
這里可以看到,2、swift函數可以有默認參數了,這個吸取了c的優點,在多參數並大多數情況參數是固定的情況這個非常不錯的特性,填參是個多麻煩的事情呀。跳進default可以看到
/// directly for any ad hoc requests. open static let `default`: SessionManager = { let configuration = URLSessionConfiguration.default configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders return SessionManager(configuration: configuration) }()
這里的語法有點奇怪。
3、這里其實就是使用一個閉包或函數來初始化一個變量。這樣的好處就是很方便的在構造對象前進行一些默認值的設置。Alamofire里面也有大量這樣的用法。
4、同樣我們可以看到這里會有個關鍵字open。這個是swift3.0才有的,這里就跟swift的訪問控制相關。在swift中會有模塊及源文件的概念。
模塊:指的是一個單獨的代碼集合,如一個framework,一個bundle,一個單獨的子工程里的所有文件。
源文件指的是:一個個單一swift源碼文件。
訪問控制
open:公開的,同部外部模塊都可訪問,這個開放性最大。
public:也是公開的,但還是與open有所區別,
internal:模塊內部的,即同一模塊內可以訪問,其它模塊不能訪問。
private:私有的,這個指在內一類內部可訪問
fileprivate:文件私有的,這個指在同一類內並且在同一源文件內可訪問。extension 可以在另一個源文件擴展一個類,此時如果原類中是fileprivate,在擴展的類中也不能訪問,如果是private,那么在擴展類中也是可以訪問的。
open與public區別:public在只能限制在定義所在模塊內部進行繼承與方法的重寫,而open則是只要模塊有被import,在可在此模塊中繼承或者重寫被import進來的模塊中的類或方法。
對於為什么沒有protected,swift的設計者們是這樣考慮的:https://developer.apple.com/swift/blog/?id=11
一個public的類的內部成員默認是internal的。
open internal(set) var delegate: TaskDelegate