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
8402 1
如何解决Swift混编的module编译错误
|
存储 安全 生物认证
苹果上架APP遇到提示缺少出口合规证明时应该如何处理-什么是APP加密文稿-优雅草卓伊凡
苹果上架APP遇到提示缺少出口合规证明时应该如何处理-什么是APP加密文稿-优雅草卓伊凡
1348 62
苹果上架APP遇到提示缺少出口合规证明时应该如何处理-什么是APP加密文稿-优雅草卓伊凡
|
Web App开发 前端开发 Android开发
iOS 唤起 APP: Universal Link(通用链接)(下)
iOS 唤起 APP: Universal Link(通用链接)(下)
2361 0
iOS 唤起 APP: Universal Link(通用链接)(下)
|
Android开发
08. 【Android教程】相对布局 RelativeLayout
08. 【Android教程】相对布局 RelativeLayout
707 0
|
安全 iOS开发
iOS页面布局:UIScrollView的布局问题
iOS页面布局:UIScrollView的布局问题
869 63
|
程序员 索引
SwiftUI极简教程18:SwipeCard卡片滑动效果的使用(上)
SwiftUI极简教程18:SwipeCard卡片滑动效果的使用(上)
1663 0
SwiftUI极简教程18:SwipeCard卡片滑动效果的使用(上)
|
运维 监控 网络安全
com.jcraft.jsch.JSchException: Session.connect: java.net.SocketTimeoutException: Read timed out 问题
【6月更文挑战第5天】com.jcraft.jsch.JSchException: Session.connect: java.net.SocketTimeoutException: Read timed out 问题
2617 1
|
前端开发
单步调试报错 Thread 1: EXC_BAD_ACCESS (code=1, address=0x6565656565)
单步调试报错 Thread 1: EXC_BAD_ACCESS (code=1, address=0x6565656565)
623 0
|
自然语言处理 程序员 开发工具
iOS生成Bundle 资源文件包与使用
iOS生成Bundle 资源文件包与使用
1158 0
|
存储 监控 vr&ar
大师学SwiftUI第18章Part1 - 图片选择器和相机
如今,个人设备主要用于处理图片、视频和声音,苹果的设备也不例外。SwiftUI可以通过Image视图显示图片,但需要其它框架的支持来处理图片、在屏幕上展示视频或是播放声音。本章中我们将展示Apple所提供的这类工具。
807 1

热门文章

最新文章