美文网首页Swift学习
RXSwift - 合并 Observable (combine

RXSwift - 合并 Observable (combine

作者: 内蒙小猿 | 来源:发表于2020-08-21 08:34 被阅读0次

        let bag = DisposeBag ()
        
        let queueA = PublishSubject<String>()
        let queueB = PublishSubject<String>()
        
        let sequece = Observable.combineLatest(queueA, queueB)
        sequece.subscribe(onNext: { (str) in
            print(str)
        }, onError: nil, onCompleted: {
            print("onCompleted")
        }) {
            print("onDisposed")
        }.disposed(by: bag)

一、combineLast 把多个observables 中的 \color{#008080}{当前事件} 合成一个事件,最多接收7个参数,也可以合并事件类型不同的 Sub Observables。

        queueA.onNext("A1")
        queueB.onNext("B1")
        queueA.onNext("A2")
        queueB.onNext("B2")
    
        queueA.onCompleted()
        queueB.onCompleted()

1.1、执行过程

queueA
---------------A1-----------A2--------------------
queueB
---------------B1-----------B2--------------------
         
          combineLast(queueA , queueB)
         
sequeue
***********(A1,B1)*****(A2,B1)*****(A2,B2)*********

\color{#DEB887}{执行结果:("A1", "B1") -> ("A2", "B1") -> ("A2", "B2") -> onCompleted -> onDisposed}

1.2、note

  • 当queue中发生A1时,由于queue中没有事件发生,所以不会触发 combineLatest 。 只有在每一个Sub-observable 中都发生过一个事件之后,combineLatest 才会触发 OnNext 的 closure。

  • 于是在 queueB 发生 B1后,combineLatest 触发了 closure, (A1,B1)生成。

  • 继续走下去, queueA 发生了 A2, 此时queueB 当前事件还是 B1。(A2,B1)生成。

  • 最后 queueB 发出了 B2 ,此时 queueA 的当前事件还是 A2。(A2,B2)生成。

二、zip: 只合并\color{#008080}{最新}事件,它的用法和combineLatest 几乎一样。

        
        queueA.onNext("A1")
        queueB.onNext("B1")
        queueA.onNext("A2")
        queueB.onNext("B2")
    
        queueA.onCompleted()
        queueB.onCompleted()

2.1 执行过程

queueA
---------------A1-----------A2--------------------
queueB
---------------B1-----------B2--------------------
         
          zip(queueA , queueB)
         
sequeue
***********(A1,B1)*****(A2,B2)********************

\color{#DEB887}{执行结果:("A1", "B1") -> ("A2", "B2") -> onCompleted -> onDisposed}

2.2 note

  • 每次合并完之后,所有Sub-observable 中的事件可以理解为被消费掉了。 只有当下次所有序列中都产生新的事件,才会进行下一次合并。于是 就只能订阅到 (A1,B1)(A2,B2)。

  • 另外和combineLatest 不同的是, zip 合成中的observable中, 其中任何一个Sub-observable 发生了 Completed 事件,整个observable 就完成了。

相关文章

网友评论

    本文标题:RXSwift - 合并 Observable (combine

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