美文网首页
RxSwfit 学习笔记(三)AnyObserver & Bin

RxSwfit 学习笔记(三)AnyObserver & Bin

作者: 尤先森 | 来源:发表于2019-08-27 23:47 被阅读0次

在上文我们已经有介绍了Observable 跟 Observer 的作用与运用。并且已经知道使用subscribe()来会订阅 Observable 。

那么今天我们就来了解一下AnyObserver 与 Binder

AnyObserver

AnyObserver从字面意义上来理解,就是任意一种观察者。
我们先看一下案例

  • 通常情况下我们创建序列的时候是这样的
         //创建序列
        let testOB = Observable<String>.create { ob in
            ob.onNext("test")
            ob.onCompleted()
            return Disposables.create()
        }
        
        //订阅序列
        testOB.subscribe(onNext: { (str) in
            print(str)
        }, onError: { (error) in
            print(error)
        }, onCompleted: {
            print("completed")
        }).disposed(by: disposebag)
  • 那么用了AnyObserver是什么样
        let observer: AnyObserver<String> = AnyObserver { (event) in
            switch event {
            case .next(let str):
                print("next event: \(str)")
            case .error(let error):
                print("have an error: \(error)")
            case .completed:
                print("observer complete")
            }
        }
        
        let ob:Observable<String> = Observable.just("this is a message from just")
        ob.subscribe(observer).disposed(by: disposebag)

打印结果:

next event: this is a message
observer complete

很好理解,就是把订阅的那一长串代码,抽离出来。并且我们可以做这样大胆的操作。

  • 多个序列共用同一个observer
        let observer: AnyObserver<String> = AnyObserver { (event) in
            switch event {
            case .next(let str):
                print("next event: \(str)")
            case .error(let error):
                print("have an error: \(error)")
            case .completed:
                print("observer complete")
            }
        }
        
        let ob:Observable<String> = Observable.just("this is a message from just")
        ob.subscribe(observer).disposed(by: disposebag)
        
        enum MyError: Error {
            case errorA
            case errorB
        }
        //只发送一个error
        let ob2 = Observable<String>.error(MyError.errorA)
        ob2.subscribe(observer).disposed(by: disposebag)
        
        //只发送一个completed
        let ob3 =  Observable<String>.empty()
        ob3.subscribe(observer).disposed(by: disposebag)

打印结果:

next event: this is a message
observer complete
have an error: errorA
observer complete

Binder

Binder 主要有以下两个特征:

  • 不会处理错误事件
  • 确保绑定都是在给定 Scheduler 上执行(默认 MainScheduler)
    一旦产生错误事件,在调试环境下将执行 fatalError,在发布环境下将打印错误信息。”

摘录来自: “RxSwift 中文文档。”

案例:

我们当前监听一个String,然后需要给一个label赋值

以我们目前所了解到的RxSwift的内容,那么我们需要这么做。

        //创建序列
        let testOB = Observable<String>.create { ob in
            ob.onNext("this is label text")
            ob.onCompleted()
            return Disposables.create()
        }
        
        //订阅序列
        testOB.subscribe(onNext: { (str) in
            self.titleLabel.text = str
        }).disposed(by: disposebag)

在使用Binder前,其实代码已经不算多了,但是还可以再精简。

        let binder:Binder<String> = Binder(titleLabel){ (label,str) in
            label.text = str
        }
        
        Observable<String>.just("😜😜😜😜")
                          .bind(to: binder)
                          .disposed(by: disposebag)

相关文章

网友评论

      本文标题:RxSwfit 学习笔记(三)AnyObserver & Bin

      本文链接:https://www.haomeiwen.com/subject/jenyectx.html