ios多個網路請求之間的處理(Swift版)

語言: CN / TW / HK

前文ios多個網路請求之間的處理(OC版)介紹了OC中對於網路請求的處理。本文淺談一下RXSwift如何運用在Swift中。才踏入rx的大門,若有不正確的地方,歡迎大家在評論區留言和討論。共同進步💪。 點選OC版

https://juejin.cn/post/7078892935093157902

前文OC版中介紹的幾種方法在swift中同樣適用,不過就是替換下API的適用罷了。本文主要介紹RXSwift的使用。

1. 多個網路請求之間順序執行

eg:這裡我們有一個需求:首先通過使用者的賬號和密碼獲取到token,然後通過token獲取使用者的資訊。

1.在沒使用rx之前我們可能會很容易的寫出以下程式碼

我們先用enum簡單封裝一個網路請求。日常開發中的網路需求基本山是非同步的,這裡為了演示rx的使用,就簡單的處理了。

``` private enum API {

// 閉包的形式     /// 獲取token     static func token_clourse(userName: String,                       password: String,                       completed:(String?,Error?) -> ()) {         print("userName = (userName),password = (password),(Thread.current)")         completed("09b123123",nil)     }

/// 通過token獲取使用者資訊     static func userInfo_clourse(token: String,                          completed:(String?,Error?) -> ()) {         completed("使用者的資訊為xxx",nil)     } } ``` 然後我們在控制器中進行呼叫:

//可以看到閉包巢狀非常難看,這僅僅是2個閉包。可想而知隨著需求的擴充套件,閉包的巢狀層次可能越來越多 API.token_clourse(userName: "小白不是小白", password: "123456") { token, error in             guard let token = token else {                 return             }             print("token = \(token)")             API.userInfo_clourse(token: token) { userInfo, error in                 if let userInfo = userInfo {                     print("userInfo = \(userInfo)")                 }             }         } 看看結果: image.png

2.我們看看使用了rx後的程式碼:

首先向剛才的API列舉中新增如下程式碼:

``` // RX     static func token_rx(userName: String,                       password: String) -> Observable { print("userName = (userName),password = (password)")         return Observable.just("09b123123")     }

static func userInfo_rx(token: String) -> Observable {         return Observable.just("使用者的資訊為xxx")     } ``` 這裡的Observable其實對應了Collection中的Sequence。只不過Observable比Sequence多了可以非同步或同步發出event事件的能力。具體講解後續可能會出一期具體文章。

然後我們在控制器中進行呼叫:

// 這程式碼量是不是簡潔多了,這種函數語言程式設計不僅減少了閉包的巢狀層次,同時讓程式碼閱讀起來很舒服 // 控制器中加一句程式碼:private let disposeBag = DisposeBag() // 垃圾袋,用於回收obsever的。將obsever的宣告週期交給垃圾袋,當垃圾袋denit後,其中的內容也就被釋放了。 API.token_rx(userName: "小白不是小白", password: "123456")             .flatMapLatest(API.userInfo_rx)             .subscribe(                 onNext: {                     print("userInfo = \($0)")                 }             )             .disposed(by: disposeBag) 看看結果: image.png

2. 多個網路請求執行完後,在執行其他操作

eg:這裡有一個需求:獲取到banner的資料和列表的資料後,更新UI。我們看看如何使用rx來完成 同樣我們首先向剛才的API列舉中新增如下程式碼:

``` // RX

/// 獲取banner的資料     static func bannerData_rx() -> Observable<[String]> {         return Observable.just(["banner1","banner2"])     }

/// 獲取列表的資料     static func listData_rx() -> Observable<[String]> {         return Observable.just(["list1","list2"])     } ``` 然後我們在控制器中進行呼叫:

// 通過zip操作符,將兩個網路請求組裝成一個新的可觀察序列 Observable           .zip(                 API.bannerData_rx(),                 API.listData_rx()             )             .subscribe(                 onNext: {                     print("banners = \($0)\nlist = \($1)")                     DispatchQueue.main.async {                         print("重新整理UI")                     }                 }             )             .disposed(by: disposeBag) 看看結果: image.png