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")
相关文章
【Stata】append和merge的区别
【Stata】append和merge的区别
534 0
|
5月前
|
数据处理
R语言数据合并:掌握`merge`与`dplyr`中`join`的巧妙技巧
【8月更文挑战第29天】如果你已经在使用`dplyr`进行数据处理,那么推荐使用`dplyr::join`进行数据合并,因为它与`dplyr`的其他函数(如`filter()`、`select()`、`mutate()`等)无缝集成,能够提供更加流畅和一致的数据处理体验。如果你的代码中尚未使用`dplyr`,但想要尝试,那么`dplyr::join`将是一个很好的起点。
|
7月前
|
SQL
【Databend】merge 的用法
【Databend】merge 的用法
49 1
|
7月前
|
安全 Kotlin
Kotlin中的安全导航操作符?.、空合并运算符?:以及let函数的实践与理解
Kotlin中的安全导航操作符?.、空合并运算符?:以及let函数的实践与理解
|
7月前
|
存储 算法 数据挖掘
Leetcode二十三题:合并K个升序链表【22/1000 python】
Leetcode二十三题:合并K个升序链表【22/1000 python】
|
8月前
|
Java Go C++
Golang每日一练(leetDay0118) 扁平化嵌套列表迭代器、整数拆分
Golang每日一练(leetDay0118) 扁平化嵌套列表迭代器、整数拆分
62 0
Golang每日一练(leetDay0118) 扁平化嵌套列表迭代器、整数拆分
es6扩展运算符、concat方法合并多个数组
es6扩展运算符、concat方法合并多个数组
58 0
|
JavaScript 前端开发
js数据排序方法(sort)?
js数据排序方法(sort)?
RxSwift操作符操作符map、flatMap、flatMapLatest、filter的使用与区别
RxSwift操作符操作符map、flatMap、flatMapLatest、filter的使用与区别
436 1
|
Python
【Python零基础入门篇 · 15】:内置函数二【min()和max函数、zip()拉链函数、map()映射函数、reduce()】
【Python零基础入门篇 · 15】:内置函数二【min()和max函数、zip()拉链函数、map()映射函数、reduce()】
126 0
【Python零基础入门篇 · 15】:内置函数二【min()和max函数、zip()拉链函数、map()映射函数、reduce()】