很多時(shí)候, 需要將兩個(gè)事件隊(duì)列合并來處理, 例如, 你想在用戶確實(shí)輸入了用戶名和密碼后, 才啟用登錄按鈕
merge
合并兩個(gè)隊(duì)列例如如下兩個(gè)隊(duì)列
--a1--a2-a3----a4--->
---b1-------b3------>
合并之后會(huì)變成
--a1-b1-a2-a3-b3-a4-->
let observableA = PublishSubject<String>()
let observableB = PublishSubject<String>()
Observable.merge(observableA, observableB).subscribe { (event) in
self.print(event)
}.disposed(by: disposeBag)
observableA.onNext("a1")
observableB.onNext("b1")
observableA.onNext("a2")
observableA.onNext("a3")
observableB.onNext("b2")
observableA.onNext("a4")
zip
zip 會(huì)將兩個(gè)事件合并為一個(gè)事件, 事件的總數(shù)與最小的隊(duì)列一致, 并且, 要兩個(gè)都發(fā)生變化才會(huì)發(fā)送事件, 而且只要兩組事件序列各自內(nèi)部順序是一致的, 不管兩個(gè)序列之間元素順序的先后, 那么最后 zip 的結(jié)果也是一致的,
zip
例如上圖中, 上方隊(duì)列只要順序是1, 2, 3, 4, 5, 下方是 A, B, C, D 那么不管1 和 A 那個(gè)在前, 最終的輸出都是1A 2B...
zip
你可以去這個(gè)網(wǎng)站http://reactivex.io/documentation/operators/zip.html 上去拖動(dòng)一下那幾個(gè)事件的順序, 方便理解
combineLatest
相對(duì)于 zip 來說, combineLatest 方便理解許多, 只要雙方都有至少一次事件就可以開始了, 每次取的都是每個(gè)序列最近發(fā)生的事件
combineLatest