zoukankan      html  css  js  c++  java
  • RxSwift学习笔记10:startWith/merge/zip/combineLatest/withLatestFrom/switchLatest

         //startWith
            //该方法会在 Observable 序列开始之前插入一些事件元素。即发出事件消息之前,会先发出这些预先插入的事件消息
            Observable.of(1,2,3)
                .startWith(0)
                .subscribe(onNext:{print($0)})
                .disposed(by: disposeBag)
            /*
             0
             1
             2
             3
             */
            print("
    ")
            //插入多个数据也是可以的
            Observable.of(1,2,3)
                .startWith(0)
                .startWith(-1)
                .startWith(-2)
                .subscribe(onNext:{print($0)})
                .disposed(by: disposeBag)
            /*
             -2
             -1
             0
             1
             2
             3
             */
            
            print("
    ")
            //merge
            //该方法可以将多个(两个或两个以上的)Observable 序列合并成一个 Observable 序列。
            let ps1 = PublishSubject<Int>()
            let ps2 = PublishSubject<Int>()
            Observable.of(ps1,ps2)
                .merge()
                .subscribe(onNext:{print($0)})
                .disposed(by: disposeBag)
            ps1.onNext(1)
            ps2.onNext(10)
            ps1.onNext(2)
            ps2.onNext(20)
            ps1.onNext(3)
            ps2.onNext(30)
            ps2.onNext(40)
            ps2.onNext(50)
            ps1.onNext(30)
            /*
             1
             10
             2
             20
             3
             30
             40
             50
             30
             */
            
            print("
    ")
            //zip
            //该方法可以将多个(两个或两个以上的)Observable 序列压缩成一个 Observable 序列。
            //而且它会等到每个 Observable 事件一一对应地凑齐之后再合并。
            
            let ps3 = PublishSubject<Int>()
            let ps4 = PublishSubject<String>()
            Observable.zip(ps3, ps4) { (s1, s2) -> String in
                return "(s1)(s2)"
                }.subscribe(onNext:{print($0)}).disposed(by: disposeBag)
            ps3.onNext(1)
            ps4.onNext("A")
            ps3.onNext(2)
            ps4.onNext("B")
            ps4.onNext("C")
            ps4.onNext("D")
            ps3.onNext(3)
            ps3.onNext(4)
            ps3.onNext(5)
            
            /*
             1A
             2B
             3C
             4D
             */
       
            print("
    ")
            // combineLatest
            // 该方法同样是将多个(两个或两个以上的)Observable 序列元素进行合并。
            // 但与 zip 不同的是,每当任意一个 Observable 有新的事件发出时,它会将每个 Observable 序列的最新的一个事件元素进行合并。
            let ps5 = PublishSubject<Int>()
            let ps6 = PublishSubject<String>()
            Observable.combineLatest(ps5, ps6) { (s1, s2) -> String in
                return "(s1)(s2)"
                }.subscribe(onNext:{print($0)}).disposed(by: disposeBag)
            ps5.onNext(1)
            ps6.onNext("A")
            ps5.onNext(2)
            ps6.onNext("B")
            ps6.onNext("C")
            ps6.onNext("D")
            ps5.onNext(3)
            ps5.onNext(4)
            ps5.onNext(5)
            /*
             1A
             2A
             2B
             2C
             2D
             3D
             4D
             5D
             */
            
            print("
    ")
            //withLatestFrom:
            //该方法将两个 Observable 序列合并为一个。每当 self 队列发射一个元素时,便从第二个序列中取出最新的一个值。
            let ps7 = PublishSubject<Int>()
            let ps8 = PublishSubject<String>()
             ps7.withLatestFrom(ps8)
                .subscribe(onNext:{print($0)})
                .disposed(by: disposeBag)
            ps7.onNext(1)
            ps8.onNext("A")
            ps7.onNext(2)
            ps8.onNext("B")
            ps8.onNext("C")
            ps8.onNext("D")
            ps7.onNext(3)
            ps7.onNext(4)
            ps7.onNext(5)
            /*
             A
             D
             D
             D
             */
            
            print("
    ")
            //switchLatest
            //switchLatest 有点像其他语言的 switch 方法,可以对事件流进行转换。
            //比如本来监听的 subject1,我可以通过更改 variable 里面的 value 更换事件源。变成监听 subject2。
            let subject1 = BehaviorSubject(value: "A")
            let subject2 = BehaviorSubject(value: "1")
            
            let variable = BehaviorRelay(value: subject1)
            
            variable.asObservable()
                .switchLatest()
                .subscribe(onNext: { print($0) })
                .disposed(by: disposeBag)
            
            subject1.onNext("B")
            subject1.onNext("C")
            
            //改变事件源
            variable.accept(subject2)//1
            subject1.onNext("D")
            subject2.onNext("2") //2
            
            //改变事件源
            variable.accept(subject1)//D
            subject2.onNext("3")
            subject1.onNext("E")//E
            
            /*
             A
             B
             C
             1
             2
             D
             E
             */
    

      

  • 相关阅读:
    03_02_leetcode_24_删除有序数组的重复项
    03_02_leetcode_141_环形链表
    03_02_leetcode_24_两两交换链表中的结点
    Solution -「ZJOI 2014」力
    Solution -「GXOI / GZOI 2019」宝牌一大堆
    Solution -「CSP 2019」Centroid
    Solution -「CSP 2019」Partition
    Note -「Suffix Automaton」SAM
    Solution -「BalticOI 2004」Sequence
    Solution -「BZOJ 3779」重组病毒
  • 原文地址:https://www.cnblogs.com/mapanguan/p/9294797.html
Copyright © 2011-2022 走看看