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
*/