天天看點

Swift 3.0封裝 URLSession 的GET/SET方法代替 Alamofire

更新到 Swift3.0 之後,新版本的 Alamofire 隻支援 iOS 9.0 以上的系統,如果要适配 iOS 8,需要自己封裝 URLSession,下面是筆者的方案:

這裡使用的是 Swift 自己的原生類型 URLSession,而不是NSURLSession。

Alamofire 4.0 中的request方法的參數清單如下:

method參數的類型是HTTPMethod,這個是系統類型,可以從外部傳值,預設值是get。在request方法的方法體中,調用SessionManager.default.request方法,接受了全部的外部參數,并傳回一個組裝好的 DataRequest對象:

SessionManager.default.request方法的實作如下:

這個方法主要完成的工作是加工request:使用url、method和headers三個參數建立一個URLRequest對象,然後把參數parameters中儲存的HTTP請求攜帶的參數按照encoding所指定的編碼方式進行編碼得到最終的URLRequest對象,隻有這兩步都順利完成了編碼才算成功。成功後調用另一個重載的request方法,這個方法接受request字面量,可以直接傳入生成的URLRequest對象。失敗的情況下調用的是另一個重載的request方法,接受一個Error類型,實際上所有失敗的情況下都會調用這個request方法。

所有重載版本的request方法最後都會傳回一個 DataRequest類型,這個DataRequest是Alamofire封裝的request對象,繞的有點暈。如果你準備自己封裝,需要建立一個URLRequest對象代替DataRequest,這裡我用了SwiftyJSON庫,用來序列化網絡傳回的結果:

Alamofire的調用是函數式的,使用Alamofire請求傳回一個son格式的資料的時候使用的是 responseJSON 方法,原來的格式大緻如下:

responseJSON方法的回調是基于result的狀态的,但是原生的URLResponse對象沒有這個狀态,是以你需要自己去判斷成功與失敗的狀态:

此時如果删掉

會發現有幾處報錯的地方,這是因為我們仍舊在使用Alamofire中的代碼,首先HTTPMethod這個枚舉類型是定義在Alamofire中的,因為原生API中指定HTTP方法使用的是字元串格式,編譯器不會幫你檢查錯誤,你可以把HTTPMethod的定義拷貝出來:

然後我們建立的URLRequest使用的實際上是Alamofire擴充的URLRequest,你需要自己動手寫一個擴充,實作一個相同的構造器:

下一個問題是,Alamofire封裝了一套把參數寫進HTTP請求的編碼方法,也就是你調用的:

這個方法中非常多依賴的方法,羅列如下:

這一系列方法抛出的錯誤也是Alamofire自己定義的,拷貝出來:

現在報錯的代碼部分修改為:

繼續閱讀