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")
相关文章
|
8天前
|
Go
Golang切片copy踩坑
Golang切片copy踩坑
29 0
|
6月前
【Stata】append和merge的区别
【Stata】append和merge的区别
180 0
|
8天前
|
JavaScript
操作符infer的作用是什么?
操作符infer的作用是什么?
|
8月前
rxjs 操作符 pairwise 的一个例子
rxjs 操作符 pairwise 的一个例子
41 0
rxjs 操作符 pairwise 的一个例子
|
6月前
es6扩展运算符、concat方法合并多个数组
es6扩展运算符、concat方法合并多个数组
30 0
|
8月前
|
索引
rxjs 里 Skip 操作符的一个使用场景
rxjs 里 Skip 操作符的一个使用场景
88 0
|
11月前
|
Python
Python语言中extend和append的区别
Python语言中extend和append的区别
79 0
|
Python
python中读取txt文件时split()函数的妙用
python中读取txt文件时split()函数的妙用
461 2
python中读取txt文件时split()函数的妙用
|
SQL 数据挖掘 数据库
DataFrame多表合并拼接函数concat、merge参数详解+代码操作展示
DataFrame多表合并拼接函数concat、merge参数详解+代码操作展示
672 0
DataFrame多表合并拼接函数concat、merge参数详解+代码操作展示
Rxjava源码解析笔记 | 剖析map、flatmap操作符的使用与联系
Rxjava源码解析笔记 | 剖析map、flatmap操作符的使用与联系