本文整理了一下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)