RxSwift+Moya+ObjectMapper優雅的網路請求
優雅的網路請求本人已寫了一個開源的拿來及用的[Swift專案框架](https://github.com/liuniuliuniu/LLProgramFramework.Swift) 可以參考此框架來通篇閱讀此文章更有幫助 有喜歡的還望送人玫瑰手留餘香哦
當然這個拿來及用的[Swift專案框架](https://github.com/liuniuliuniu/LLProgramFramework.Swift)有不合理的地方 還望大神指點一二
**末尾於彩蛋**
> 文章目錄
一 Rxswift 簡單介紹
二 Moya 簡單介紹以及使用
三 ObjectMapper 簡單介紹以及使用
四 RxSwift+Moya+ObjectMapper優雅的網路請求及資料轉換
一 RxSwift 簡單介紹
- RxSwift是Swift函式響應式程式設計的一個開源庫,由GitHub的ReactiveX組織開發和維護
- 其他語言像C#,Java 和JS也有: Rx.Net、RxJava、RxJS
- RxSwift的目的是讓資料/事件流和非同步任務能夠更方便的序
列化處理 能夠使用Swift進行響應式程式設計
本文就不詳細介紹Rxswift 樓主之前寫過RxSwift 的介紹以及使用 可以參看一下 [RxSwift 個人學習筆記記錄](http://www.jianshu.com/p/00ded20182d2)
二 Moya 簡單介紹以及使用
1 Moya 簡單介紹
>[Moya](https://github.com/Moya/Moya)是一個基於Alamofire的Networking library,並且新增了對於ReactiveCocoa和RxSwift的介面支援,大大簡化了開發過程,是Reactive Functional Programming的網路層首選。
Github上的官方介紹羅列了Moya的一些特點:
* 編譯的時候會檢查API endpoint
* 可以用列舉值清楚地定義很多endpoint
* 增加了stubResponse型別,大大方便了unit testing
2 Moya 的 使用
首先我們需要宣告一個enum來對請求進行明確分類。
1 2 3 4 |
|
然後我們需要讓這個enum遵守TargetType協議,在這個協議中可以看到 TargetType定義了我們傳送一個網路請求所需要的東西,baseURL,parameter,method等一些計算性屬性,我們要做的就是去實現這些東西,當然有帶預設值的我們可以不去實現。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|
寫好上邊的以後 我們就可以去傳送一個請求了
1 2 3 4 5 6 7 8 |
|
上邊就是請求資料了 回撥出來json資料
>如果對RxSwift還不熟悉的話 建議去看一下之前寫的文章[RxSwift 個人學習筆記記錄](http://www.jianshu.com/p/00ded20182d2)
Moya其實是提供了非常方面的RxSwift擴充套件
簡單介紹一下上邊方法和變數中的各個名詞:
* RxMoyaProvider是MoyaProvider的子類,是對RxSwift的擴充套件
* filterSuccessfulStatusCodes() 是Moya為RxSwift提供的擴充套件方法,顧名思義,可以得到成功成功地網路請求,忽略其他的
* mapJSON() 也是Moya RxSwift的擴充套件方法,可以把返回的資料解析成 JSON 格式 會返回一個Observable
然後我們就可以對這個Observable進行訂閱了
然後我們就可以得到下邊的json資料 只展示了部分資料
網路請求就已經結束了 就這這麼簡單輕鬆and easy ????
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
|
三 ObjectMapper 簡單介紹以及使用
json得到了 接下來那就是json轉模型了
>ObjectMapper 是一個在 Swift 下資料轉模型的非常好用,並且很 Swift 的一個框架。以前我們在寫 OC 程式碼的時候用 MJExtension 轉模型,到了 Swift 的時代趕緊將 ObjectMapper 使用起來吧。
為了支援對映,類或者結構體只需要實現Mappable協議。這個協議包含兩個方法 而且這兩個方法是必須實現的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
一旦你的物件實現了 Mappable, ObjectMapper就可以讓你輕鬆的實現和 JSON 之間的轉換。
把 JSON 字串轉成 model 物件:
1 |
|
把一個 model 轉成 JSON 字串:
1 |
|
還有一些具體的基礎使用可以參考[ObjectMapper中文翻譯](https://github.com/SwiftOldDriver/ObjectMapper-CN-Guide)
四 RxSwift+Moya+ObjectMapper優雅的網路請求及資料轉換
RxSwift結合MVVM 簡直的太合適不過了
我們將 網路請求放在VM裡邊
1 2 3 4 5 6 7 8 9 10 |
|
可以看到我們上邊程式碼中 `provider
.request(.GetHomeList)
.filterSuccessfulStatusCodes()
.mapJSON().` 這個方法本身應該得到 JSON的 但是我後邊跟了一個mapObject 的方法 這個方式可以直接根據json的格式轉換成模型 或者是模型陣列 來看一下這個方法 我是單獨定義了一個json轉模型的類`LLToModelExtension.swift`
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
介紹一下上邊程式碼中各個方法以及名詞
* 1 `mapObject` 方法是處理單個物件的 `mapArray` 處理物件陣列
* 2 如果傳進來的資料 是一個`NSDictionary` 的話 那麼就利用 `ObjectMapper` 的 `map` 方法對映這些資料,這個方法會呼叫你之前在 mapping 方法裡面定義的邏輯。
* 3 如果 `response` 不是一個 `dictionary`, 那麼就丟擲一個錯誤。
* 4 在底部自定義了簡單的 Error,繼承了 Swift 的 Error 類,在實際應用過程中可以根據需要提供自己想要的 Error。
彩蛋
**可能會有人問 為什麼請求回來的資料 要賦值給modelObserable.Value呢 而不是賦值給一個模型陣列 然後reloadData呢**
這裡我用的RXSwift裡邊UItableView繫結資料的一個方法 再也不用寫一大串資料來源方法了 這個也可以去[這裡](http://www.jianshu.com/p/00ded20182d2)參考哦
1 2 3 4 5 6 |
|
[Swift專案框架地址](https://github.com/liuniuliuniu/LLProgramFramework.Swift)
參考文章
[Moya入坑記](http://www.codertian.com/2017/01/21/iOS-moya-ru-keng-usage/)
[RxSwift+Moya](http://www.jianshu.com/p/c1494681400b)
相關文章
- Kotlin + 協程 + Retrofit + MVVM優雅的實現網路請求KotlinMVVM
- 網路請求優化之取消請求優化
- 如何優雅地取消Retrofit請求?
- Flask中請求資料的優雅傳遞Flask
- 優雅地使用GET和POST請求方法
- Android網路請求(終) 網路請求框架RetrofitAndroid框架
- Android網路請求(3) 網路請求框架OkHttpAndroid框架HTTP
- 也許這是最優雅的前端請求方案前端
- Android網路請求(4) 網路請求框架VolleyAndroid框架
- 網路請求了
- Android App優化之高效網路請求AndroidAPP優化
- 優雅地減少redux請求樣板程式碼Redux
- 使用 Guzzle 中介軟體進行優雅的請求重試
- HTTP網路請求原理HTTP
- iOS原生網路請求iOS
- 網路請求圖片
- 網路請求LCNetwork
- 網路資料請求
- 【Go】優雅的讀取http請求或響應的資料GoHTTP
- 【Go】優雅的讀取 http 請求或響應的資料GoHTTP
- BitmapFactory 解析網路請求的inputstream
- swift 網路請求Alamofire的使用Swift
- Android okHttp網路請求之Get/Post請求AndroidHTTP
- 如何優雅地讀寫HttpServletRequest和HttpServletResponse的請求體HTTPServlet
- laravel如何利用中介軟體優雅的記錄請求日誌Laravel
- 【Go】優雅的讀取 http 請求或響應的資料-續GoHTTP
- 【Go】優雅的讀取http請求或響應的資料-續GoHTTP
- Jest中Mock網路請求Mock
- OC:封裝網路請求封裝
- iOS 使用Moya網路請求iOS
- Android網路請求(2)Android
- RxJava + Retrofit完成網路請求RxJava
- iOS網路請求穿值iOS
- 網路請求框架對比框架
- Android Http請求框架二:xUtils 框架網路請求AndroidHTTP框架
- Swift:面向協議的網路請求Swift協議
- 全面分析前端的網路請求方式前端
- MVVM框架的搭建(三)——網路請求MVVM框架