美文网首页
RxSwift-场景序列

RxSwift-场景序列

作者: Code_人生 | 来源:发表于2019-08-12 17:43 被阅读0次

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

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(())  <NSThread: 0x600001920bc0>{number = 1, name = main}
订阅:next(())  <NSThread: 0x600001920bc0>{number = 1, name = main}

Binder

  • 简化订阅流程
  • 不会处理错误事件
  • 确保绑定都是在给定 Scheduler 上执行(默认 MainScheduler)
  • 一旦产生错误事件,在调试环境下将执行 fatalError,在发布环境下将打印错误信息。
//        let observer: AnyObserver<Bool> = 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<Bool>(self.label) { (lab, value) in
             print("Binder 当前线程:\(Thread.current)")
            lab.isHidden = value
        }
        
        let observable = Observable<Bool>.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<Any> {
        print("请求网络了 \(Thread.current)")
        return Observable<Any>.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<Any>.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<Void> 有点相似。
        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<Any>.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-场景序列

    序列的创建方式

  • RxSwift-场景序列

    简化创建流程简化订阅流程 ControlEvent ControlEvent: 专门用于描述 UI 控件所产生的事...

  • RxSwift-场景序列总结

    这个篇章介绍平时开发经常运用的序列,这些序列都是由普通序列封装而来,但是对平时开发是由大大的帮助,简易流程,并且非...

  • RxSwift-初探

    RxSwift-初探RxSwift核心逻辑-源码分析RxSwift-Observable序列的创建方式RxSwif...

  • RxSwift-序列继承链

    上一篇里我们去找了RxSwift的Create文件,create这个方法会返回一个AnonymousObserva...

  • RxSwift-序列的创建

    empty 序列事件是Int类型的,这里调用emty函数 没有序列,只能complete just 单个信号序列创...

  • 【071】《故事》读书笔记(6)

    10、场景设计、分析和布局谋篇 幕由序列构成,序列由场景构成,场景由节拍构成。幕设计的前提的场景设计。场景设计由转...

  • 读书总结|序列

    【序列】由一系列(3—5个)场景构成的具有价值叠加的序列。每个场景都具有一个内在的价值表现,序列中的最后一个场景的...

  • RxSwift(二)——场景序列

    这篇文章总结一下一些场景的序列: controlEvent 1.在主线程监听2.会共享附加作用3.没有error事...

  • MySql序列生成

    序号序列 常见场景: 为每行记录添加序号 日期序列 常见场景: 生成某段范围内的时间(如某月每天, 某天每时等)生...

网友评论

      本文标题:RxSwift-场景序列

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