RxSwift-场景序列

简化创建流程
简化订阅流程

ControlEvent

  • ControlEvent: 专门用于描述 UI 控件所产生的事件,它具有以下特征
  • 不会产生 error 事件
  • 一定在 MainScheduler 订阅(主线程订阅)
  • 一定在 MainScheduler 监听(主线程监听)
  • 会共享附加作用
        let controlEventOB = self.button.rx.controlEvent(.touchUpInside)
        
        controlEventOB.subscribe { (result) in
            print("订阅:\(result)  \(Thread.current)")
        }.disposed(by: self.disposeBag)
        
        controlEventOB.subscribe { (result) in
            print("订阅:\(result)  \(Thread.current)")
            }.disposed(by: self.disposeBag)

订阅:next(())  {number = 1, name = main}
订阅:next(())  {number = 1, name = main}

Binder

  • 简化订阅流程
  • 不会处理错误事件
  • 确保绑定都是在给定 Scheduler 上执行(默认 MainScheduler)
  • 一旦产生错误事件,在调试环境下将执行 fatalError,在发布环境下将打印错误信息。
//        let observer: AnyObserver = AnyObserver{ (event) in
//            print("observer 当前线程:\(Thread.current)")
//            switch event {
//            case .next(let value):
//                self.label.isHidden = value
//                break
//            case .error(let error):
//                print("observer error:\(error)")
//                break
//            case .completed:
//                print("完成了")
//                break
//            }
//        }
        
        let binder = Binder(self.label) { (lab, value) in
             print("Binder 当前线程:\(Thread.current)")
            lab.isHidden = value
        }
        
        let observable = Observable.create { (ob) -> Disposable in
            ob.onNext(true)
//            ob.onError(NSError.init(domain: "com.imefuture.cn", code: 10090, userInfo: nil))
//            ob.onCompleted()
            return Disposables.create()
        }.observeOn(ConcurrentDispatchQueueScheduler(queue: DispatchQueue.global()))
        
//        observable.bind(to: observer).disposed(by: self.disposeBag)
        observable.bind(to: binder).disposed(by: self.disposeBag)

Driver

  • Driver 是一个精心准备的特征序列。它主要是为了简化 UI 层的代码。不过如果你遇到的序列具有以下特征,你也可以使用它:
  • 不会产生 error 事件
  • 一定在 MainScheduler 监听(主线程监听)
  • 会共享附加作用
        let result = self.textFiled.rx.text.orEmpty
            .asDriver() //普通序列转化为
            .throttle(.milliseconds(500))
            .flatMap {
                self.dealWithData(inputText: $0)
                    .asDriver(onErrorJustReturn: "检测到了错误")
        }
        
        result.map { "长度:\(($0 as! String).count)"}
            .drive(self.label.rx.text)
            .disposed(by: disposeBag)
        
        result.map { ($0 as! String) }
            .drive(self.button.rx.title())
            .disposed(by: disposeBag)

    func dealWithData(inputText: String) -> Observable {
        print("请求网络了 \(Thread.current)")
        return Observable.create({ (ob) -> Disposable in
            if inputText == "1234" {
                ob.onError(NSError.init(domain: "com.dyz.cn", code: 2019, userInfo: nil))
            }
            DispatchQueue.global().async {
                print("发送之前看看:\(Thread.current)")
                ob.onNext("已经输入:\(inputText)")
                ob.onCompleted()
            }
            return Disposables.create()
        })
    }

Signal

  • Signal 和 Driver 相似,唯一的区别是,Driver 会对新观察者回放(重新发送)上一个元素,而 Signal 不会对新观察者回放上一个元素。
  • 这个demo运行 label 是有值的,但是对于我们的新的观察者btn是没有值
  • 不会产生 error 事件
  • 一定在 MainScheduler 监听(主线程监听)
  • 会共享附加作用
        let result = self.textFiled.rx.text.orEmpty
            .asSignal(onErrorJustReturn: "没有值")
            .throttle(.milliseconds(500))
            .flatMap {
                self.dealWithData(inputText: $0 )
                    .asSignal(onErrorJustReturn: "检测到了错误")
        }
        
        result.map { "长度:\(($0 as! String).count)" }
            .emit(to: self.label.rx.text)
            .disposed(by: disposeBag)
        
        result.map { ($0 as! String) }
            .emit(to: self.button.rx.title())
            .disposed(by: disposeBag)

Single

  • Single 是 Observable 的另外一个版本。不像 Observable 可以发出多个元素,它要么只能发出一个元素,要么产生一个 error 事件。
  • 发出一个元素,或一个 error 事件
  • 不会共享附加作用
        let singleOB = Single.create { (single) -> Disposable in
            print("singleOB 是否共享")
            single(.success("Dyz"))
            single(.success("Hello"))
            single(.error(NSError.init(domain: "com.ime.cn", code: 098, userInfo: nil)))
            return Disposables.create()
        }
        
        singleOB.subscribe { (result) in
            print("订阅:\(result)")
        }.disposed(by: self.disposeBag)
        singleOB.subscribe { (result) in
            print("订阅:\(result)")
        }.disposed(by: self.disposeBag)

singleOB 是否共享
订阅:success("Dyz")
singleOB 是否共享
订阅:success("Dyz")

Completable

  • Completable 是 Observable 的另外一个版本。不像 Observable 可以发出多个元素,它要么只能产生一个 completed 事件,要么产生一个 error 事件
  • 发出零个元素
  • 发出一个 completed 元素,或一个 error 事件
  • 不会共享附加作用
  • Completable 适用于那种你只关心任务是否完成,而不需要在意任务返回值的情况。它和 Observable 有点相似。
        let completableOB = Completable.create { (completable) -> Disposable in
            print("completableOB 是否共享")
            completable(.completed)
            completable(.error(NSError.init(domain: "com.ime.cn", code: 909, userInfo: nil)))
            return Disposables.create()
        }
        
        completableOB.subscribe { (result) in
            print("订阅:\(result)")
        }.disposed(by: disposeBag)
        
        completableOB.subscribe { (result) in
            print("订阅:\(result)")
        }.disposed(by: disposeBag)

completableOB 是否共享
订阅:completed
completableOB 是否共享
订阅:completed

Maybe

  • Maybe 是 Observable 的另外一个版本。它介于 Single 和 Completable 之间,它要么只能发出一个元素,要么产生一个 completed 事件,要么产生一个 error 事件。
  • 发出一个元素或者一个 completed 事件或者一个 error 事件
  • 不会共享附加作用
  • 如果你遇到那种可能需要发出一个元素,又可能不需要发出时,就可以使用 Maybe。
        let maybeOB = Maybe.create { (maybe) -> Disposable in
            print("maybeOB 是否共享")
            maybe(.success("dyz"))
            maybe(.completed)
            maybe(.error(NSError.init(domain: "com.ime.cn", code: 89, userInfo: nil)))
            return Disposables.create()
        }
        
        maybeOB.subscribe { (result) in
            print("订阅:\(result)")
        }.disposed(by: disposeBag)
        
        maybeOB.subscribe { (result) in
            print("订阅:\(result)")
        }.disposed(by: disposeBag)

maybeOB 是否共享
订阅:success("dyz")
maybeOB 是否共享
订阅:success("dyz")

你可能感兴趣的:(RxSwift-场景序列)