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")
相关文章
|
Swift iOS开发 Perl
如何解决Swift混编的module编译错误
前言很多iOS工程都是基于Object-C开发,再逐步向Swift演进,演进过程中不可避免要进行Swift混编。Swift模块需要支持LLVM Module规范,混编工程会遇到各种Module编译错误。这对于不熟悉的同学来说简直是灾难,严重影响开发效率。本文会介绍常见的Module编译错误,希望对大家有所帮助。常见错误1:Could not build module xxx当一个OC模块引用了Sw
7450 1
如何解决Swift混编的module编译错误
Flutter ListView懒加载(滑动不加载,停止滑动加载)
前言:为了更好的减小网络的带宽,使得列表更加流畅,我们需要了解懒加载,也称延迟加载。关于上一章的登录界面,各位属实难为我了,我也在求ui小姐姐,各位点点赞给我点动力吧~
|
11月前
|
Swift
Swift 中 struct(结构体)和 class(类)的区别
【10月更文挑战第10天】理解 struct 和 class 的区别对于正确使用 Swift 语言进行编程非常重要。在实际开发中,需要根据具体的需求和场景来选择合适的数据类型,以充分发挥它们的优势,提高代码的质量和效率。
RxSwift操作符操作符map、flatMap、flatMapLatest、filter的使用与区别
RxSwift操作符操作符map、flatMap、flatMapLatest、filter的使用与区别
695 1
|
iOS开发
如何找到Xcode中下载的Provisioning Profile文件
如何找到Xcode中下载的Provisioning Profile文件
1591 1
|
数据采集 API 调度
Flutter笔记:关于SchedulerBinding
Flutter笔记:关于SchedulerBinding
275 1
|
索引
RxSwift操作符take、skip、materialize、withLatestFrom、interval等的使用
RxSwift操作符take、skip、materialize、withLatestFrom、interval等的使用
379 1
|
安全 调度 C语言
iOS多线程之GCD-同步、异步、并发、串行、线程组、栅栏函数、信号量等全网最全的总结
iOS多线程之GCD-同步、异步、并发、串行、线程组、栅栏函数、信号量等全网最全的总结
1407 1
|
存储 前端开发
RxSwift+MVVM项目实战-MVVM架构介绍以及实战初体验
RxSwift+MVVM项目实战-MVVM架构介绍以及实战初体验
714 0
|
JSON HandyJSON Swift
RxSwift+MVVM项目实战-多分组TableView+MJRefresh+RxAlamofire+HandyJSON的使用
RxSwift+MVVM项目实战-多分组TableView+MJRefresh+RxAlamofire+HandyJSON的使用
505 0