//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的更多相关文章

  1. thinkphp学习笔记10—看不懂的路由规则

    原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...

  2. 《C++ Primer Plus》学习笔记10

    <C++ Primer Plus>学习笔记10 <<<<<<<<<<<<<<<<<&l ...

  3. SQL反模式学习笔记10 取整错误

    目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据. 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...

  4. golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息

    golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...

  5. Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息

    </pre>Spring MVC 学习笔记10 -- 实现简单的用户管理(4.3)用户登录--显示全局异常信息<p></p><p></p>& ...

  6. Hadoop学习笔记(10) ——搭建源码学习环境

    Hadoop学习笔记(10) ——搭建源码学习环境 上一章中,我们对整个hadoop的目录及源码目录有了一个初步的了解,接下来计划深入学习一下这头神象作品了.但是看代码用什么,难不成gedit?,单步 ...

  7. APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause

    转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...

  8. SpringMVC:学习笔记(10)——整合Ckeditor且实现图片上传

    SpringMVC:学习笔记(10)——整合Ckeditor且实现图片上传 配置CKEDITOR 精简文件 解压之后可以看到ckeditor/lang下面有很多语言的js,如果不需要那么多种语言的,可 ...

  9. mybatis学习笔记(10)-一对一查询

    mybatis学习笔记(10)-一对一查询 标签: mybatis mybatis学习笔记10-一对一查询 resultType实现 resultMap实现 resultType和resultMap实 ...

随机推荐

  1. http stream

    http stream 博客分类: http://canofy.iteye.com/blog/2097876 j2EE   StringBuilder sb = new StringBuilder() ...

  2. Creating adaptive web recommendation system based on user behavior(设计基于用户行为数据的适应性网络推荐系统)

    文章介绍了一个基于用户行为数据的推荐系统的实现步骤和方法.系统的核心是专家系统,它会根据一定的策略计算所有物品的相关度,并且将相关度最高的物品序列推送给用户.计算相关度的策略分为两部分,第一部分是针对 ...

  3. 阿里云服务器 CentOS 安装Mysql 5.6

    下载:https://dev.mysql.com/downloads/file/?id=471181   第一步: 安装mysql5姿势是要先安装带有可用的mysql5系列社区版资源的rpm包 [ro ...

  4. JQ attr prop 区别

    解决方法:使用prop属性代替attr属性 一.Attr除 checked, selected, 或 disabled状态属性外,其余的属性均可用attr()设置和修改.$("img&quo ...

  5. 非virtual函数,用指针进行upcast

    void print_func(A* p) { p -> print(); } int main() { A a(); B b(,); //a.print(); //b.print(); pri ...

  6. 002之MFCSocket异步编程

    当今的网络程序通用体系结构大多为C/S模式,服务器监听收到来自客户端的请求,然后响应并作出应答. 界面对话框如下,输入IP信息进行通信后再进行连接,连接成功即可开始通信.左侧为客户端,右侧为服务端. ...

  7. synchronized 和reentrantlock的优缺点

    reentrantlock的优点 可以添加多个检控条件, 如果使用synchronized,则只能使用一个. 使用 reentrant locks 可以有多个wait()/notify() 队列. [ ...

  8. LevelDB源码分析-编码

    编码(util/coding.h util/coding.cc) LevelDB将整型编码为二进制字符串的形式,同时又能够和ASCII字符区分. 首先是定长编码: void EncodeFixed32 ...

  9. SQL Server与MySQL在“存在则更新,不存在则插入”并发处理上的一些差异。

    “存在则更新,不存在则插入的逻辑”并发情况下的处理 在sqlserver中: 在sqlserver中,是通过可序列化隔离级别+排它锁的方式来锁定一个范围来实现的当前锁定一个不存在的记录的时候,sqls ...

  10. resize2fs

    VPS是15G的..但是dh和fdisk显示不一样..求解 df:Filesystem Size Used Avail Use% Mounted onudev 236M 0 236M 0% /devt ...