RxSwift-常用序列

698 阅读3分钟

RxSwift篇章

1.ControlEvent

ControlEvent: 专门用于描述 UI 控件所产生的事件,它具有以下特征

  • 不会产生 error 事件

  • 一定在 MainScheduler 订阅(主线程订阅)

  • 一定在 MainScheduler 监听(主线程监听)

  • 会共享附加作用

let controlEventOb = self.button.rx.controlEvent(.touchUpInside)
        controlEventOb.subscribe { (result) in
            print(result)
            print(Thread.current)
        }
        .disposed(by: disposeBag)
  • controlEvent(.touchUpInside)内部: events.subscribeOn(ConcurrentMainScheduler.instance),保证主队列调度
  • UI响应事件,不会存在失败响应

2.binder

  • 不会处理错误事件

  • 确保绑定都是在给定 Scheduler 上执行(默认 MainScheduler)

  • 一旦产生错误事件,在调试环境下将执行 fatalError,在发布环境下将打印错误信息。

        let binder = Binder<Bool>(self.label) { (lab, isHidden) in
            print("binder")
            print("Binder当前线程:\(Thread.current)")
            lab.isHidden = isHidden
        }
        //
        let observable1 = Observable<Bool>.create { (ob) -> Disposable in
            ob.onNext(true)
           // ob.onError(NSError.init(domain: "com.err.cn", code: 10086, userInfo: nil))
           // ob.onCompleted()
            return Disposables.create()
            }
        .observeOn(ConcurrentDispatchQueueScheduler(queue: DispatchQueue.global()))
        //
        observable1.bind(to: binder).disposed(by: self.disposeBag)

3.driver

Driver 是一个精心准备的特征序列。它主要是为了简化 UI 层的代码。不过如果你遇到的序列具有以下特征,你也可以使用它:

  • 不会产生 error 事件

  • 一定在 MainScheduler 监听(主线程监听)

  • 会共享附加作用

        let result = self.textFiled.rx.text.orEmpty
            .asDriver() // 普通序列转化
        // 绑定到label上面
        result.map { "长度:\(($0 ).count)" }
            .drive(self.label.rx.text)
            .disposed(by: disposeBag)

        // 绑定到button上面
        result.map { ($0 ) }
            .drive(self.button.rx.title())
            .disposed(by: disposeBag)

asDriver()内部封装:

  • observeOn(DriverSharingStrategy.scheduler),保证了调度环境在主线程

  • source.share(replay: 1, scope: .whileConnected), 保证序列状态共享

4.signal

Signal 和 Driver 相似,唯一的区别是,Driver 会对新观察者回放(重新发送)上一个元素,而 Signal 不会对新观察者回放上一个元素。

  • 这个demo初始运行时 label响应,但是对于我们的新的观察者button不响应.后续输入框事件都响应.

  • 不会产生 error 事件

  • 一定在 MainScheduler 监听(主线程监听)

  • 会共享附加作用

        let result = self.textFiled.rx.text.orEmpty
            .asSignal(onErrorJustReturn: "没有值") // 普通序列转化为
        // 绑定到label上面
        result.map { "长度:\(($0 ).count)" }
            .emit(to: self.label.rx.text)
            .disposed(by: disposeBag)

        // 绑定到button上面
        result.map { ($0 ) }
            .emit(to: self.button.rx.title())
            .disposed(by: disposeBag)

asSignal()内部封装:

  • observeOn(DriverSharingStrategy.scheduler)保证了调度环境在主线程

  • catchErrorJustReturn(onErrorJustReturn) 保证了无错误信号

  • source.share(scope: .whileConnected) 序列状态共享

5. single

它要么只能发出一个元素,要么产生一个 error 事件。

  • 发出一个元素,或一个 error 事件

  • 不会共享附加作用

        let singleOB = Single<Any>.create { (single) -> Disposable in
            print("singleOB 是否共享")
            single(.success("OK"))
            single(.error(NSError.init(domain: "com.lgcoooci.cn",
            code: 10086, userInfo: nil)))
            return Disposables.create()
        }

        singleOB.subscribe { (reslut) in
            print("订阅:\(reslut)")
            }.disposed(by: disposeBag)

        singleOB.subscribe { (reslut) in
            print("订阅:\(reslut)")
            }.disposed(by: disposeBag)

6.completable

它要么只能产生一个 completed 事件,要么产生一个 error 事件

  • 发出零个元素

  • 发出一个 completed 元素,或一个 error 事件

  • 不会共享附加作用

  • Completable 适用于那种你只关心任务是否完成,而不需要在意任务返回值的情况。它和 Observable 有点相似。

        let completableOB = Completable.create { (completable) -> Disposable in
            completable(.completed)
            completable(.error(NSError.init(domain: "error....",
            code: 10086, userInfo: nil)))
            return Disposables.create()
        }

        completableOB.subscribe { (reslut) in
            print("订阅:\(reslut)")
            }.disposed(by: disposeBag)

        completableOB.subscribe { (reslut) in
            print("订阅:\(reslut)")
            }.disposed(by: disposeBag)

7.maybe

它介于 Single 和 Completable 之间,它要么只能发出一个元素,要么产生一个completed 事件,要么产生一个 error 事件。

  • 发出一个元素或者一个 completed 事件或者一个 error 事件

  • 不会共享附加作用

  • 如果你遇到那种可能需要发出一个元素,又可能不需要发出时,就可以使用 Maybe。

        let maybeOB = Maybe<Any>.create { (maybe) -> Disposable in
            //maybe(.success("OK"))
            //maybe(.completed)
            maybe(.error(NSError.init(domain: "error...",
            code: 10086, userInfo: nil)))
            return Disposables.create()
        }

        maybeOB.subscribe { (reslut) in
            print("订阅:\(reslut)")
            }.disposed(by: disposeBag)

        maybeOB.subscribe { (reslut) in
            print("订阅:\(reslut)")
            }.disposed(by: disposeBag)