RxSwift学习笔记10:startWith/merge/zip/combineLatest/withLatestFrom/switchLatest
//startWith
//该方法会在 Observable 序列开始之前插入一些事件元素。即发出事件消息之前,会先发出这些预先插入的事件消息
Observable.of(1,2,3)
.startWith(0)
.subscribe(onNext:{print($0)})
.disposed(by: disposeBag)
/*
0
1
2
3
*/
print("\n")
//插入多个数据也是可以的
Observable.of(1,2,3)
.startWith(0)
.startWith(-1)
.startWith(-2)
.subscribe(onNext:{print($0)})
.disposed(by: disposeBag)
/*
-2
-1
0
1
2
3
*/ print("\n")
//merge
//该方法可以将多个(两个或两个以上的)Observable 序列合并成一个 Observable 序列。
let ps1 = PublishSubject<Int>()
let ps2 = PublishSubject<Int>()
Observable.of(ps1,ps2)
.merge()
.subscribe(onNext:{print($0)})
.disposed(by: disposeBag)
ps1.onNext(1)
ps2.onNext(10)
ps1.onNext(2)
ps2.onNext(20)
ps1.onNext(3)
ps2.onNext(30)
ps2.onNext(40)
ps2.onNext(50)
ps1.onNext(30)
/*
1
10
2
20
3
30
40
50
30
*/ print("\n")
//zip
//该方法可以将多个(两个或两个以上的)Observable 序列压缩成一个 Observable 序列。
//而且它会等到每个 Observable 事件一一对应地凑齐之后再合并。 let ps3 = PublishSubject<Int>()
let ps4 = PublishSubject<String>()
Observable.zip(ps3, ps4) { (s1, s2) -> String in
return "\(s1)\(s2)"
}.subscribe(onNext:{print($0)}).disposed(by: disposeBag)
ps3.onNext(1)
ps4.onNext("A")
ps3.onNext(2)
ps4.onNext("B")
ps4.onNext("C")
ps4.onNext("D")
ps3.onNext(3)
ps3.onNext(4)
ps3.onNext(5) /*
1A
2B
3C
4D
*/ print("\n")
// combineLatest
// 该方法同样是将多个(两个或两个以上的)Observable 序列元素进行合并。
// 但与 zip 不同的是,每当任意一个 Observable 有新的事件发出时,它会将每个 Observable 序列的最新的一个事件元素进行合并。
let ps5 = PublishSubject<Int>()
let ps6 = PublishSubject<String>()
Observable.combineLatest(ps5, ps6) { (s1, s2) -> String in
return "\(s1)\(s2)"
}.subscribe(onNext:{print($0)}).disposed(by: disposeBag)
ps5.onNext(1)
ps6.onNext("A")
ps5.onNext(2)
ps6.onNext("B")
ps6.onNext("C")
ps6.onNext("D")
ps5.onNext(3)
ps5.onNext(4)
ps5.onNext(5)
/*
1A
2A
2B
2C
2D
3D
4D
5D
*/ print("\n")
//withLatestFrom:
//该方法将两个 Observable 序列合并为一个。每当 self 队列发射一个元素时,便从第二个序列中取出最新的一个值。
let ps7 = PublishSubject<Int>()
let ps8 = PublishSubject<String>()
ps7.withLatestFrom(ps8)
.subscribe(onNext:{print($0)})
.disposed(by: disposeBag)
ps7.onNext(1)
ps8.onNext("A")
ps7.onNext(2)
ps8.onNext("B")
ps8.onNext("C")
ps8.onNext("D")
ps7.onNext(3)
ps7.onNext(4)
ps7.onNext(5)
/*
A
D
D
D
*/ print("\n")
//switchLatest
//switchLatest 有点像其他语言的 switch 方法,可以对事件流进行转换。
//比如本来监听的 subject1,我可以通过更改 variable 里面的 value 更换事件源。变成监听 subject2。
let subject1 = BehaviorSubject(value: "A")
let subject2 = BehaviorSubject(value: "1") let variable = BehaviorRelay(value: subject1) variable.asObservable()
.switchLatest()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag) subject1.onNext("B")
subject1.onNext("C") //改变事件源
variable.accept(subject2)//1
subject1.onNext("D")
subject2.onNext("2") //2 //改变事件源
variable.accept(subject1)//D
subject2.onNext("3")
subject1.onNext("E")//E /*
A
B
C
1
2
D
E
*/
RxSwift学习笔记10:startWith/merge/zip/combineLatest/withLatestFrom/switchLatest的更多相关文章
- thinkphp学习笔记10—看不懂的路由规则
原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...
- 《C++ Primer Plus》学习笔记10
<C++ Primer Plus>学习笔记10 <<<<<<<<<<<<<<<<<&l ...
- SQL反模式学习笔记10 取整错误
目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据. 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...
- golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息
golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...
- Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息
</pre>Spring MVC 学习笔记10 -- 实现简单的用户管理(4.3)用户登录--显示全局异常信息<p></p><p></p>& ...
- Hadoop学习笔记(10) ——搭建源码学习环境
Hadoop学习笔记(10) ——搭建源码学习环境 上一章中,我们对整个hadoop的目录及源码目录有了一个初步的了解,接下来计划深入学习一下这头神象作品了.但是看代码用什么,难不成gedit?,单步 ...
- APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause
转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...
- SpringMVC:学习笔记(10)——整合Ckeditor且实现图片上传
SpringMVC:学习笔记(10)——整合Ckeditor且实现图片上传 配置CKEDITOR 精简文件 解压之后可以看到ckeditor/lang下面有很多语言的js,如果不需要那么多种语言的,可 ...
- mybatis学习笔记(10)-一对一查询
mybatis学习笔记(10)-一对一查询 标签: mybatis mybatis学习笔记10-一对一查询 resultType实现 resultMap实现 resultType和resultMap实 ...
随机推荐
- rpm梳理
- tomcat 部署swagger 请求到后端乱码
问题: @ApiOperation(value = "", notes = "查看关键词列表") @ResponseBody @RequestMapping(v ...
- leetcode160
/** * Definition for singly-linked list. * public class ListNode { * public int val; * public ListNo ...
- CentOS内网机器利用iptables共享公网IP上网
公司有个业务是2B的以及日活不大,所以两台服务器搞定,一个6M EIP.两台机器都是CentOS7系统EIP为 xxx.xxx.xxx.xxx绑在 内网ip为 172.18.30.175的服务器上,内 ...
- mvn多环境下的配置
在应用中,我们经常会遇到本地,测试和生产3种不同的环境,因此需要去配置不同的application. 定义resources: <resources> <resource> & ...
- Python函数定义和使用
函数是一段可以重复多次调用的代码,通过输入的参数值,返回需要的结果.通过使用函数,可以提高代码的重复利用率.本文主要介绍Python函数的定义.调用和函数参数设置方法. 函数的定义 Python函数定 ...
- 从performance_schema中查看MySQL活动Session的详细执行信息
本文出处:http://www.cnblogs.com/wy123/p/7851294.html 在做数据库的异常诊断的时候,之前在SQL Server上的时候,最主要的参考信息之一就是去看当前的活动 ...
- https://segmentfault.com/a/1190000014637728
原网站地址:https://segmentfault.com/a/1190000009657295#articleHeader3 基于 vue2 + element-ui 构建的后台管理系统 vue. ...
- JAVA结合testng断言verify(断言失败不中断继续执行)
原理: 1.自已构造一个断言类,把Assert.assertEquals给try catch住. 2.利用testng的监听类在测试方法运行结束后进行分析. 代码: 断言类: package com. ...
- 迭代器模块 itertools
无限迭代器 itertools 包自带了三个可以无限迭代的迭代器.这意味着,当你使用他们时,你要知道你需要的到底是最终会停止的迭代器,还是需要无限地迭代下去. 这些无限迭代器在生成数字或者在长度未知的 ...