RxSwift操作符merge、zip、combinLatest的使用

简介: RxSwift操作符merge、zip、combinLatest的使用


01. Merge

merge的特征

1. 通过使用merge操作符你可以将多个Observables合并成一个,当某一个Observable发出一个元素时,他就将这个元素发出。

2. 如果某一个Observable发出一个onError事件,那么被合并的Observable也会将它发出,并且立即终止序列。

3. 如果某一个Observable发出一个onCompleted事件,发出这个onCompleted事件的序列之后将无法发出元素,其他Observable可以继续正常发出元素,那么被合并的Observable会判断被合并的是否所有的ObservableonCompleted,如果都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事件,那么被zipObservable也会将它发出,并且立即终止序列。

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")
相关文章
|
3月前
|
Dart JavaScript 前端开发
Dart笔记:glob 文件系统遍历
Dart笔记:glob 文件系统遍历
79 0
|
9月前
【Stata】append和merge的区别
【Stata】append和merge的区别
264 0
|
2月前
|
安全 Kotlin
Kotlin中的安全导航操作符?.、空合并运算符?:以及let函数的实践与理解
Kotlin中的安全导航操作符?.、空合并运算符?:以及let函数的实践与理解
13 0
|
2月前
|
SQL
【Databend】merge 的用法
【Databend】merge 的用法
18 1
|
3月前
|
C++ 索引
【C++ 泛型编程 高级篇】 C++ 14 模版元编程 遍历元组 编译期生成整数序列 std::index_sequence和std::make_index_sequence 使用指南(二)
【C++ 泛型编程 高级篇】 C++ 14 模版元编程 遍历元组 编译期生成整数序列 std::index_sequence和std::make_index_sequence 使用指南
107 0
|
3月前
|
编解码 算法 程序员
【C++ 泛型编程 高级篇】 C++ 14 模版元编程 遍历元组 编译期生成整数序列 std::index_sequence和std::make_index_sequence 使用指南(三)
【C++ 泛型编程 高级篇】 C++ 14 模版元编程 遍历元组 编译期生成整数序列 std::index_sequence和std::make_index_sequence 使用指南
50 0
|
3月前
|
存储 编译器 程序员
【C++ 泛型编程 高级篇】 C++ 14 模版元编程 遍历元组 编译期生成整数序列 std::index_sequence和std::make_index_sequence 使用指南(一)
【C++ 泛型编程 高级篇】 C++ 14 模版元编程 遍历元组 编译期生成整数序列 std::index_sequence和std::make_index_sequence 使用指南
143 0
|
3月前
|
JavaScript
操作符infer的作用是什么?
操作符infer的作用是什么?
|
9月前
es6扩展运算符、concat方法合并多个数组
es6扩展运算符、concat方法合并多个数组
41 0
|
Python
Python语言中extend和append的区别
Python语言中extend和append的区别
115 0