ios多個網路請求之間的處理(Swift版)
前文ios多個網路請求之間的處理(OC版)介紹了OC中對於網路請求的處理。本文淺談一下RXSwift如何運用在Swift中。才踏入rx的大門,若有不正確的地方,歡迎大家在評論區留言和討論。共同進步💪。 點選OC版
http://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)")
}
}
}
看看結果:
2.我們看看使用了rx後的程式碼:
首先向剛才的API列舉中新增如下程式碼:
```
// RX
static func token_rx(userName: String,
password: String) -> Observable
static func userInfo_rx(token: String) -> Observable
然後我們在控制器中進行呼叫:
// 這程式碼量是不是簡潔多了,這種函數語言程式設計不僅減少了閉包的巢狀層次,同時讓程式碼閱讀起來很舒服
// 控制器中加一句程式碼: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)
看看結果:
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)
看看結果: