Alamofire設計之道
1.初識
Swift編寫的iOS App的網路模組都是基於Alamofire。Alamofire就是建立在NSURLSession上的封裝。NSURLSession是在2013年推出的新API,並且Apple在2015年廢棄了NSURLConnection。如果你的App還在用以NSURLConnection建立的網路層(比如AFNetworking 2.x),那麼你真的應該考慮升級到NSURLSession(比如AFNetworking 3.x),廢棄的API也許還能正常工作,但是Apple已對其不再維護,當然也就不支援HTTP 2.0等新特性。
2.我們來對比一下,同樣GET一個URL,然後把資料解析成JSON。
使用NSURLSession層次的API如下
guard let url = URL(string:"https://raw.githubusercontent.com/LeoMobileDeveloper/ReactNativeFiles/master/person.json") else{return;} letdataTask= URLSession.shared.dataTask(with: url) { (data, response, error) in guard let data =data else{return; }do{let json=try JSONSerialization.jsonObject(with:data, options:.allowFragments) print(json) }catch let error{ print(error) }};dataTask.resume()
使用Alamofire
Alamofire.request("https://raw.githubusercontent.com/LeoMobileDeveloper/React-Native-Files/master/person.json").responseJSON { (response) in if let JSON = response.result.value {
print("JSON: \(JSON)")
}
}
可以看到,使用系統的API,我們不得不先建立URL,然後建立DataTask,並且Resume。接著在callback裡去解析JSON。由於Swift是一種強型別的語言,我們不得不進行大量的邏輯判斷和try-catch。
而Alamofire把這些步驟簡化成了一個靜態的方法呼叫,並且用鏈式的方式來處理非同步的Response解析。由於是鏈式的,你可以用鏈式的方式實現很多邏輯,比如驗證返回值:
Alamofire.request("https://httpbin.org/get")
.validate(statusCode: 200..<300) //返回值驗證
.responseData { response in //解析返回的資料
switch response.result {
case .success:
print("Validation Successful")
case .failure(let error):
print(error)
}
}
鏈式的非同步處理有很多優點:
優雅的處理大量的callback
程式碼更容易理解,更容易維護
不需要在每一步都進行錯誤檢查
3.繼承
NRULSessionTask是由繼承來實現的,繼承關係如下
URLSessionTask — Task的基類
URLSessionDataTask - 拉取URL的內容NSData
URLSessionUploadTask — 上傳資料到URL,並且返回是NSData
URLSessionDownloadTask - 下載URL的內容到檔案
URLSessionStreamTask — 建立TCP/IP連線
仿照這種關係,Alamofire的Request也是類似的繼承關係:
Request — Task的基類
DataRequest - 拉取URL的內容NSData
UploadRequest — 上傳資料到URL,並且返回是NSData
DownloadRequest - 下載URL的內容到檔案
StreamRequest — 建立TCP/IP連線
其實原因和很簡單:父類提供基礎的屬性和方法來給子類複用。
在Request中,除了繼承,還使用了聚類的方式:由父類提供介面,初始化子類
4.協議
Swift是面向協議程式設計的語言。
Alamofire 大量使用了協議和代理。
Alamofire是一個優雅的Swift開源庫,它的程式碼真的很優雅,強烈建議對Swift感興趣並且想深入學習的同學用幾天的空餘時間去研究下。看的時候多問自己幾個問題:
為什麼這裡要用protocol而不用繼承?
為什麼這裡要用struct而不用class?
…..
總之,多問為什麼,然後找到答案,就會很有收穫。
下一篇介紹一下Moya的設計之道
相關文章
- Flutter Dojo的設計之道Flutter
- Alamofire-Cookie相關Cookie
- 程式設計師修煉之道程式設計師
- 程式設計師簡歷之道程式設計師
- 程式設計思想之冪等性 | 程式設計之道程式設計
- 程式設計師修煉之道6程式設計師
- 程式設計師修煉之道7程式設計師
- 程式設計師修煉之道~三程式設計師
- 程式設計師修煉之道~四程式設計師
- 程式設計師修煉之道~五程式設計師
- 程式設計師修煉之道2程式設計師
- 程式設計師修煉之道1程式設計師
- 程式設計師修煉之道3程式設計師
- 程式碼分層的設計之道
- 日常 Python 程式設計優雅之道Python程式設計
- 程式設計師的修煉之道3程式設計師
- 程式設計師的修煉之道2程式設計師
- 2024.10.29(程式設計師的修煉之道)程式設計師
- 2024.10.22(程式設計師的修煉之道)程式設計師
- 2024.10.17(程式設計師的修煉之道)程式設計師
- 產品設計中的精益之道
- 程式設計之道(1987) - Geoffrey James翻譯程式設計
- React 應用設計之道 - curry 化妙用React
- 程式設計師修煉之道總結3程式設計師
- 程式設計師修煉之道總結1程式設計師
- 程式設計師必備能力——晉升之道程式設計師
- 架構整潔之道二(設計原則)架構
- 《程式設計師修煉之道》 讀後感(七)程式設計師
- 程式設計師修煉之道讀後感(2)程式設計師
- 程式設計師修煉之道讀後感(1)程式設計師
- 程式設計師修煉之道讀後感(3)程式設計師
- 程式設計師修煉之道讀後感02程式設計師
- 雲原生時代的DevOps平臺設計之道dev
- 《程式設計師修煉之道》讀書筆記程式設計師筆記
- 讀軟體開發安全之道:概念、設計與實施09安全設計
- 架構整潔之道:優秀設計或多餘,有效設計最可取架構
- Node之道:設計、架構和最佳實踐 | Alex Kondov架構
- 我眼中的 Nginx(五):Nginx — 子請求設計之道Nginx