RxSwift-Driver

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

你可能感兴趣的:(RxSwift-Driver)