十一雷客、結合操作(Combining Observables)
結合操作(或者稱合并操作)指的是將多個 Observable
序列進行組合芒珠,拼裝成一個新的 Observable
序列。
1搅裙,startWith
(1)基本介紹
- 該方法會在
Observable
序列開始之前插入一些事件元素皱卓。即發(fā)出事件消息之前,會先發(fā)出這些預先插入的事件消息部逮。
(2)使用樣例
let disposeBag = DisposeBag()
Observable.of("2", "3")
.startWith("1")
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
運行結果如下:
(3)當然插入多個數(shù)據(jù)也是可以的
let disposeBag = DisposeBag()
Observable.of("2", "3")
.startWith("a")
.startWith("b")
.startWith("c")
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
運行結果如下:
2娜汁,merge
(1)基本介紹
- 該方法可以將多個(兩個或兩個以上的)
Observable
序列合并成一個Observable
序列。
(2)使用樣例
let disposeBag = DisposeBag()
let subject1 = PublishSubject<Int>()
let subject2 = PublishSubject<Int>()
Observable.of(subject1, subject2)
.merge()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
subject1.onNext(20)
subject1.onNext(40)
subject1.onNext(60)
subject2.onNext(1)
subject1.onNext(80)
subject1.onNext(100)
subject2.onNext(1)
運行結果如下:
3兄朋,zip
(1)基本介紹
- 該方法可以將多個(兩個或兩個以上的)
Observable
序列壓縮成一個Observable
序列掐禁。 - 而且它會等到每個
Observable
事件一一對應地湊齊之后再合并。
(2)使用樣例
let disposeBag = DisposeBag()
let subject1 = PublishSubject<Int>()
let subject2 = PublishSubject<String>()
Observable.zip(subject1, subject2) {
"\($0)\($1)"
}
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
subject1.onNext(1)
subject2.onNext("A")
subject1.onNext(2)
subject2.onNext("B")
subject2.onNext("C")
subject2.onNext("D")
subject1.onNext(3)
subject1.onNext(4)
subject1.onNext(5)
運行結果如下:
4颅和,combineLatest
(1)基本介紹
- 該方法同樣是將多個(兩個或兩個以上的)
Observable
序列元素進行合并傅事。 - 但與
zip
不同的是,每當任意一個Observable
有新的事件發(fā)出時峡扩,它會將每個Observable
序列的最新的一個事件元素進行合并蹭越。
(2)使用樣例
let disposeBag = DisposeBag()
let subject1 = PublishSubject<Int>()
let subject2 = PublishSubject<String>()
Observable.combineLatest(subject1, subject2) {
"\($0)\($1)"
}
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
subject1.onNext(1)
subject2.onNext("A")
subject1.onNext(2)
subject2.onNext("B")
subject2.onNext("C")
subject2.onNext("D")
subject1.onNext(3)
subject1.onNext(4)
subject1.onNext(5)
運行結果如下:
5,withLatestFrom
(1)基本介紹
- 該方法將兩個
Observable
序列合并為一個教届。每當self
隊列發(fā)射一個元素時响鹃,便從第二個序列中取出最新的一個值。
(2)使用樣例
let disposeBag = DisposeBag()
let subject1 = PublishSubject<String>()
let subject2 = PublishSubject<String>()
subject1.withLatestFrom(subject2)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
subject1.onNext("A")
subject2.onNext("1")
subject1.onNext("B")
subject1.onNext("C")
subject2.onNext("2")
subject1.onNext("D")
運行結果如下:
6案训,switchLatest
(1)基本介紹
-
switchLatest
有點像其他語言的switch
方法买置,可以對事件流進行轉換。 - 比如本來監(jiān)聽的
subject1
强霎,我可以通過更改variable
里面的value
更換事件源忿项。變成監(jiān)聽subject2
。
(2)使用樣例
let disposeBag = DisposeBag()
let subject1 = BehaviorSubject(value: "A")
let subject2 = BehaviorSubject(value: "1")
let variable = Variable(subject1)
variable.asObservable()
.switchLatest()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
subject1.onNext("B")
subject1.onNext("C")
//改變事件源
variable.value = subject2
subject1.onNext("D")
subject2.onNext("2")
//改變事件源
variable.value = subject1
subject2.onNext("3")
subject1.onNext("E")
運行結果如下: