CombineLatest
當兩個Observables中的任何一個發射了數據時,使用一個函數結合每個Observable發射的最近數據項,並且基於這個函數的結果發射數據。
let first = PublishSubject<String>()
let second = PublishSubject<String>()
Observable.combineLatest(first, second) { $0 + $1 }
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
first.onNext("1")
second.onNext("A")
second.onNext("B")
first.onNext("2")
second.onNext("C")
second.onNext("D")
second.onNext("E")
first.onNext("3")
first.onNext("4")
/*
1A
1B
2B
2C
2D
2E
3E
4E
*/
Merge
將多個 Observables 合併成一個
let intSubject = PublishSubject<String>()
let strSubject = PublishSubject<String>()
Observable.of(intSubject, strSubject)
.merge()
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
intSubject.onNext("1")
strSubject.onNext("A")
strSubject.onNext("B")
intSubject.onNext("2")
strSubject.onNext("C")
strSubject.onNext("D")
strSubject.onNext("E")
intSubject.onNext("3")
intSubject.onNext("4")
/*
1
A
B
2
C
D
E
3
4
*/
StartWith
將一些元素插入到序列的頭部
let disposeBag = DisposeBag()
Observable.of("1", "2", "3")
.startWith("A")
.startWith("B")
.startWith("C", "D", "E")
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
/*
1
2
3
A
B
C
D
E
*/
SwitchLatest
將一個發射多個Observables的Observable轉換成另一個單獨的Observable,後者發射那些Observables最近發射的數據項
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")
/*
A
B
C
1
2
3
E
*/
Zip
通過一個函數將多個 Observables 的元素組合起來,然後將每一個組合的結果發出來
是由每一個源 Observables 的第一個元素組合出來的。它的第二個元素 ,是由每一個源 Observables 的第二個元素組合出來的。它的第三個元素 ,是由每一個源 Observables 的第三個元素組合出來的,以此類推。它的元素數量等於源 Observables 中元素數量最少的那個。
let disposeBag = DisposeBag()
let first = PublishSubject<String>()
let second = PublishSubject<String>()
Observable.zip(first, second) { $0 + $1 }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
first.onNext("1")
second.onNext("A")
first.onNext("2")
second.onNext("B")
second.onNext("C")
second.onNext("D")
first.onNext("3")
first.onNext("4")
/*
1A
2B
3C
4D
*/