美文网首页
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-场景序列

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