本文整理了一下Driver的用法
RxSwift-Driver
1、Driver 可以說是最復雜的 trait,它的?目標是提供一種簡便便 的?方式在 UI 層編寫響應式代碼。
2、如果我們的序列列滿?足如下特征,就可以使?用它:
? 不會產?生 error 事件
? 一定在主線程監聽(MainScheduler)
? 共享狀態變化(shareReplayLatestWhileConnected)
3、為什什么要使?用 Driver?
(1)Driver 最常使用的場景應該就是需要用序列來驅動應?程序的情況了,比如:
? 通過 CoreData 模型驅動 UI
? 使?用一個 UI 元素值(綁定)來驅動另一個 UI 元素值
(2)與普通的操作系統驅動程序一樣,如果出現序列列錯誤,應用程序將停止響應用戶輸?。
(3)在主線程上觀察到這些元素也是極其重要的,因為 UI 元素和應用程序邏輯通常不是線程安全的。
(4)使用構建 Driver 的可觀察的序列,它是共享狀態變化。
---對比普通用法和Driver用法---
這里模擬一個輸入文字請求網絡的需求:
//模擬網絡請求代碼
func dealData(inputText: String) -> Observable<Any>{
return Observable<Any>.create({ (ob) -> Disposable in
//模擬發出錯誤
if inputText == "1234" {
ob.onError(NSError(domain: "testError", code: 1001, userInfo: nil))
}
//異步發送信號
DispatchQueue.global().async {
print("模擬網絡請求返回")
ob.onNext("輸入了:\(inputText)")
ob.onCompleted()
}
return Disposables.create()
})
創建普通序列
//創建普通序列
let result = textField.rx.text.orEmpty.skip(1)
.flatMap { [weak self] (text) -> Observable<Any> in
return (self?.dealData(inputText: text))!
//執行訂閱時回到主線程,如果不加,執行訂閱時會在子線程
.observeOn(MainScheduler.instance)
.catchErrorJustReturn("監測到錯誤")
}
//共享observer序列,防止多次訂閱時多次請求網絡
.share(replay: 1, scope: .whileConnected)
result.subscribe(onNext: { (value) in
print("訂閱到:\(value)")
}).disposed(by: disposebag)
創建Driver 序列
//創建Driver 序列
//自動共享序列,多次訂閱也只請求一次網絡
//綁定到UI,自動回到主線程
let result2 = textField.rx.text.orEmpty
.asDriver()
.flatMap { (text) -> Driver<Any> in
return self.dealData(inputText: text)
.asDriver(onErrorJustReturn: "監測到錯誤")
}
result2.map { (text) -> String in
return "綁定文字到label"
}.drive(label.rx.text)
.disposed(by: disposebag)
result2.map{"綁定到button" + ($0 as! String)}
.drive(button.rx.title())
.disposed(by: disposebag)