01. Merge
merge的特征
1. 通过使用merge
操作符你可以将多个Observables
合并成一个,当某一个Observable
发出一个元素时,他就将这个元素发出。
2. 如果某一个Observable
发出一个onError
事件,那么被合并的Observable
也会将它发出,并且立即终止序列。
3. 如果某一个Observable
发出一个onCompleted
事件,发出这个onCompleted
事件的序列之后将无法发出元素,其他Observable
可以继续正常发出元素,那么被合并的Observable
会判断被合并的是否所有的Observable
都onCompleted
,如果都onCompleted
,则被合并的Observable
也会发出onCompleted
,并且立即终止序列。
func merge() { let publishSubject1 = PublishSubject<String>() let publishSubject2 = PublishSubject<String>() Observable.of(publishSubject1, publishSubject2).merge().subscribe { (ele) in print(ele) } onError: { (error) in print("error - ", error) } onCompleted: { print("oncompleted") } onDisposed: { }.disposed(by: self.disposeBag) publishSubject1.onNext("1") publishSubject1.onNext("2") publishSubject2.onNext("A") publishSubject1.onNext("3") publishSubject2.onNext("B") // publishSubject1.onError(TestError.none) publishSubject1.onCompleted() publishSubject2.onNext("C") publishSubject2.onCompleted() publishSubject1.onNext("D") publishSubject2.onNext("E") }
运行结果:
Log - 1 Log - 2 Log - A Log - 3 Log - B Log - C Log - oncompleted
02. Zip
zip的特征
1. 通过一个函数将多个Observables
的元素组合起来,然后将每一个组合的结果发出来
2. 如果某一个Observable
发出一个onError
事件,那么被zip
的Observable
也会将它发出,并且立即终止序列。
3. zip
操作符将多个(最多不超过8
个)Observables
的元素通过一个函数组合起来,然后将这个组合的结果发出来。它会严格的按照序列的索引数进行组合。例如,返回的Observable
的第一个元素,是由每一个源Observables
的第一个元素组合出来的。它的第二个元素,是由每一个源Observables
的第二个元素组合出来的。它的第三个元素 ,是由每一个源Observables
的第三个元素组合出来的,以此类推。它的元素数量等于源Observables
中元素数量最少的那个。
func zip() { let publishSubject1 = PublishSubject<String>() let publishSubject2 = PublishSubject<String>() Observable.zip(publishSubject1, publishSubject2).subscribe { (ele) in Logger("\(ele.0) - \(ele.1)") } onError: { (error) in Logger("error - \(error)") } onCompleted: { Logger("oncompleted") } onDisposed: { }.disposed(by: self.disposeBag) publishSubject1.onNext("1") publishSubject1.onNext("2") publishSubject2.onNext("A") // publishSubject2.onCompleted() publishSubject1.onNext("3") publishSubject2.onNext("B") publishSubject1.onNext("4") // publishSubject1.onError(TestError.none) // publishSubject1.onCompleted() // publishSubject2.onCompleted() publishSubject2.onNext("C") publishSubject1.onNext("4") publishSubject2.onNext("D") }
运行结果:
Log - 1 - A Log - 2 - B Log - 3 - C Log - 4 - D
03. combinLatest
combinLatest的特征
combineLatest
操作符将多个Observables
中最新的元素通过一个函数组合起来,然后将这个组合的结果发出来。这些源Observables
中任何一个发出一个元素,他都会发出一个元素(前提是,这些 Observables
曾经发出过元素)
func combineLatest() { let publishSubject1 = PublishSubject<String>() let publishSubject2 = PublishSubject<String>() Observable.combineLatest(publishSubject1, publishSubject2).subscribe { (ele) in Logger(ele) } onError: { (error) in Logger("error - \(error)") } onCompleted: { Logger("oncompleted") } onDisposed: { }.disposed(by: self.disposeBag) publishSubject1.onNext("1") // publishSubject1.onError(TestError.none) publishSubject1.onNext("2") publishSubject2.onNext("A") publishSubject1.onNext("3") publishSubject2.onNext("B") publishSubject1.onNext("4") publishSubject2.onNext("C") publishSubject1.onNext("5") }
运行结果:
Log - ("2", "A") Log - ("3", "A") Log - ("3", "B") Log - ("4", "B") Log - ("4", "C") Log - ("5", "C")