本文整理了一下Driver的用法
RxSwift-Driver
1、Driver 可以說是最復(fù)雜的 trait袋坑,它的?目標(biāo)是提供一種簡便便 的?方式在 UI 層編寫響應(yīng)式代碼。
2、如果我們的序列列滿?足如下特征,就可以使?用它:
? 不會產(chǎn)?生 error 事件
? 一定在主線程監(jiān)聽(MainScheduler)
? 共享狀態(tài)變化(shareReplayLatestWhileConnected)
3寻咒、為什什么要使?用 Driver?
(1)Driver 最常使用的場景應(yīng)該就是需要用序列來驅(qū)動應(yīng)?程序的情況了,比如:
? 通過 CoreData 模型驅(qū)動 UI
? 使?用一個 UI 元素值(綁定)來驅(qū)動另一個 UI 元素值
(2)與普通的操作系統(tǒng)驅(qū)動程序一樣颈嚼,如果出現(xiàn)序列列錯誤毛秘,應(yīng)用程序?qū)⑼V鬼憫?yīng)用戶輸?。
(3)在主線程上觀察到這些元素也是極其重要的阻课,因為 UI 元素和應(yīng)用程序邏輯通常不是線程安全的熔脂。
(4)使用構(gòu)建 Driver 的可觀察的序列,它是共享狀態(tài)變化柑肴。
---對比普通用法和Driver用法---
這里模擬一個輸入文字請求網(wǎng)絡(luò)的需求:
//模擬網(wǎng)絡(luò)請求代碼
func dealData(inputText: String) -> Observable<Any>{
return Observable<Any>.create({ (ob) -> Disposable in
//模擬發(fā)出錯誤
if inputText == "1234" {
ob.onError(NSError(domain: "testError", code: 1001, userInfo: nil))
}
//異步發(fā)送信號
DispatchQueue.global().async {
print("模擬網(wǎng)絡(luò)請求返回")
ob.onNext("輸入了:\(inputText)")
ob.onCompleted()
}
return Disposables.create()
})
創(chuàng)建普通序列
//創(chuàng)建普通序列
let result = textField.rx.text.orEmpty.skip(1)
.flatMap { [weak self] (text) -> Observable<Any> in
return (self?.dealData(inputText: text))!
//執(zhí)行訂閱時回到主線程,如果不加,執(zhí)行訂閱時會在子線程
.observeOn(MainScheduler.instance)
.catchErrorJustReturn("監(jiān)測到錯誤")
}
//共享observer序列,防止多次訂閱時多次請求網(wǎng)絡(luò)
.share(replay: 1, scope: .whileConnected)
result.subscribe(onNext: { (value) in
print("訂閱到:\(value)")
}).disposed(by: disposebag)
創(chuàng)建Driver 序列
//創(chuàng)建Driver 序列
//自動共享序列,多次訂閱也只請求一次網(wǎng)絡(luò)
//綁定到UI,自動回到主線程
let result2 = textField.rx.text.orEmpty
.asDriver()
.flatMap { (text) -> Driver<Any> in
return self.dealData(inputText: text)
.asDriver(onErrorJustReturn: "監(jiān)測到錯誤")
}
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)