RxSwift 系列(三)

RxSwift 系列(三) -- Combination Operators

前言

本篇文章将要学习如何将多个Observables组合成一个Observable
Combination OperatorsRxSwift中的实现有五种:

  • startWith
  • merge
  • zip
  • combineLatest
  • switchLatest

startWith

Observable释放元素之前,发射指定的元素序列。更多详情
上面这句话是什么意思呢?翻译成大白话就是在发送一个东西之前,我先发送一个我指定的东西。
举个??:

let disposeBag = DisposeBag()
Observable.of(["C","C++","OC"]).startWith(["先吃饱饭再学习"]).subscribe({ (event) in
        print(event)
    }).disposed(by: disposeBag)

在我们发射["C","C++","OC"]之前,我们指定了发射["先吃饱饭再学习"],因此控制台上的打印结果是:

next(["先吃饱饭再学习"])
next(["C", "C++", "OC"])
completed

startWith和栈类似,先进后出。什么意思呢?你可以在上面的例子中再添加几个.startWith()试试。

merge

将多个Observable组合成单个Observable,并且按照时间顺序发射对应事件。更多详情

感觉和gitmerge操作是一样的效果。

let disposeBag = DisposeBag()

let subject1 = PublishSubject<String>()
let subject2 = PublishSubject<String>()

Observable.of(subject1, subject2)
    .merge()
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

subject1.onNext("???")
subject1.onNext("???")
subject2.onNext("①")
subject2.onNext("②")
subject1.onNext("??")
subject2.onNext("③")

zip

将多个Observable(注意:必须是要成对)组合成单个Observable,当有事件到达时,会在每个序列中对应的索引上对应的元素发出。(ps:之前版本的RxSwift好像最多只能组合8个Observable)更多详情

let disposeBag = DisposeBag()

let subject1 = PublishSubject<String>()
let subject2 = PublishSubject<String>()

Observable.zip(subject1, subject2) { string1,string2 in
    "\(string1)--\(string2)"
    }.subscribe(onNext: {print($0)}).disposed(by: disposeBag)

subject1.onNext("A")
subject1.onNext("B")
subject1.onNext("C")

subject2.onNext("1")
subject2.onNext("2")

上述代码,因为subject.onNext("C")没有与之对应的Observable,因此不会打印,让我们看看打印结果:

A--1
B--2

combineLatest

当一个项目由两个Observables发射时,通过一个指定的功能将每个Observable观察到的最新项目组合起来,并根据该功能的结果发射事件。更多详情

let disposeBag = DisposeBag()

let subject1 = PublishSubject<String>()
let subject2 = PublishSubject<String>()

Observable.combineLatest(subject1, subject2) { string1,string2 in
    "\(string1)--\(string2)"
    }.subscribe(onNext: {print($0)}).disposed(by: disposeBag)

subject1.onNext("A")

subject2.onNext("1")
subject2.onNext("2")

subject1.onNext("B")
subject1.onNext("C")

输出结果:

A--1
A--2
B--2
C--2

图解:

switchLatest

切换Observable队列。

let disposeBag = DisposeBag()

let subject1 = BehaviorSubject(value: "1")
let subject2 = BehaviorSubject(value: "A")

let variable = Variable(subject1)

variable.asObservable()
        .switchLatest()
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)

subject1.onNext("2")
subject1.onNext("3")

variable.value = subject2

subject1.onNext("4")
subject2.onNext("B")

打印结果:

1
2
3
A
B

图解:

致谢

如果发现有错误的地方,欢迎评论,感谢!

时间: 2024-10-25 04:16:43

RxSwift 系列(三)的相关文章

RxSwift 系列(九)

前言 看完本系列前面几篇之后,估计大家也还是有点懵逼,本系列前八篇也都是参考RxSwift官方文档和一些概念做的解读.上几篇文章概念性的东西有点多,一时也是很难全部记住,大家脑子里面知道有这么个概念就行,用的时候,再来查阅一番,慢慢就掌握了. 本篇主要来深入了解一些RxSwift实战中用到的一些重要知识点,这里面有很多自己的理解,所以不免会有一些错误的地方,还请大家多多交流,如有发现错误的地方,欢迎评论. 概念 Rx系列的核心就是Observable Sequence这个相信大家心中已经有所了解

Android高效率编码-第三方SDK详解系列(三)——JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送

Android高效率编码-第三方SDK详解系列(三)--JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送 很久没有更新第三方SDK这个系列了,所以更新一下这几天工作中使用到的推送,写这个系列真的很要命,你要去把他们的API文档大致的翻阅一遍,而且各种功能都实现一遍,解决各种bug各种坑,不得不说,极光推送真坑,大家使用还是要慎重,我们看一下极光推送的官网 https://www.jpush.cn/common/ 推送比较使用,很多软件有需要,所以在这个点拿出来多讲讲,我们本节

Exchange 2013SP1和O365混合部署系列三

继续,基本上大多数都是截图,在某些地方,会有一些提示. 下面就是和本地域进行同步,主要用到的是Dirsync工具. 全都是下一步. 继续下一步. 继续下一步. 这里输入的就是O365的管理员账号.也就是当时注册的那个. 本地管理员账号. 继续下一步. 开始自动配置. 开始同步本地的账户.到WAAD. 图上我们可以看到同步状态. 继续下面的操作,激活已同步的用户. 根据需要选择. 有印象没?安装同步工具的时候选的那个密码同步的选项. 先到这吧,下篇开始在本地Exchange 2013 SP1上配置

Spring Data 系列(三) Spring+JPA(spring-data-commons)

本章是Spring Data系列的第三篇.系列文章,重点不是讲解JPA语法,所以跑开了JPA的很多语法等,重点放在环境搭建,通过对比方式,快速体会Spring 对JPA的强大功能. 准备代码过程中,保持了每个例子的独立性,和简单性,准备的源码包,下载即可使用.如果,对JPA语法想深入研究的话,直接下载在此基础上进行测试. 前言 Spring Data 系列(一) 入门:简单介绍了原生态的SQL使用,以及JdbcTemplate的使用,在这里写SQL的活还需要自己准备. Spring Data 系

Cocos2d-x创建android项目(cocos2d-x系列三)

不例外.最显眼的就是,在文件的根目录中增加了一个名为setup.py的配置文件.运行它可以配置系统的一些环境变量. 2.创建项目 新的版本我们来动手创建一个新项目吧.找到tools文件夹....额 打包的那个名为create-project.py的文件似乎木有了!原来,在新版本中,创建新项目已经可以通过命令行来创建了,相对于先前版本的图形界面,命令行更简洁.我们要在setup.py中设置参数.以mac平台为例,我们进入到对应目录,运行脚本setup.py: Setting up cocos2d-

短信开发系列(三):短信接收引擎

短信开发系列目录: 短信开发系列(一):GSM手机短信开发初探短信开发系列(二):GSM手机短信开发之短信解码短信开发系列(三):短信接收引擎 之前写了短信接收处理的一些内容,今年事情实在太多了,就停顿了这么一大段的时间.接下来会继续完成相关的内容. 今天先写用之前写的短信类库的一个应用,短信接收引擎.可以用在处理一些短信的提醒:作为前面两篇文章的一个实战运用,可以作为一个多线程.委托和事件.串口等方面知识的一个综合运用. 先来分析一下整个程序的流程: - 启动线程 - 定时运行线程主函数 -

ping的实现(原始套接字系列三)

使用Raw Socket实现Ping 仅仅采用ICMP.DLL并不能完全实现ICMP灵活多变的各类报文,只有使用Raw Socket才是ICMP的终极解决之道. 使用Raw Socket发送ICMP报文前,我们要完全依靠自己的代码组装报文: //功能:初始化ICMP的报头, 给data部分填充数据, 计算校验和void init_ping_packet(ICMPHeader *icmp_hdr, int packet_size, int seq_no){ //设置ICMP报头字段 icmp_hd

Maven 系列 三 :坐标和依赖

1 . 坐标 maven 的所有构件均通过坐标进行组织和管理.maven 的坐标通过 5 个元素进行定义,其中 groupId.artifactId.version 是必须的,packaging 是可选的(默认为jar),classifier 是不能直接定义的. groupId:定义当前 Maven 项目所属的实际项目,跟 Java 包名类似,通常与域名反向一一对应. artifactId:定义当前 Maven 项目的一个模块,默认情况下,Maven 生成的构件,其文件名会以 artifactI

acdream1075 神奇的%系列三(线代-矩阵-数论)

题目链接:http://115.28.76.232/problem?pid=1075 题意:定义一个f(n)函数,f(n) = a * f(n - 1) + b * f(n - 2), f(1) = c, f(2) = d.问f(n)在模1000000007情况下的最小循环节.即求最小的m,使对任意的n有f(n) % 1000000007 = f(n + m) % 1000000007. 思路: + ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1