了解冷热信号
在探索 RxSwift 的冷热信号之前,我们需要先了解什么是冷热信号。
冷信号 | 热信号 |
---|---|
是被动的,只在被订阅后才发送元素 | 是主动的,即使没有订阅者,它仍然会时刻推送 |
只能一对一,当有不同的订阅者,消息是重新完整发送 | 可以有多个订阅者,是一对多,集合可以与订阅者共享信息 |
订阅者在其开始发送元素之后才开始订阅,那么会错过先前发送的所有元素 |
在前两篇介绍序列的创建与订阅过程中,可以得知 Observable 序列和 Single 序列都是冷信号。从他们的信号发送的过程中,我们也可以看出来,他们都是在被订阅后才开始发送元素,并且有新的订阅者时,消息都是重新发送的。
下面来看一个冷信号的例子:
func createRxTest() { |
输出:
2022-10-20 15:26:00.772964+0800 RxDemo[49286:3751300] 订阅到: 1 |
从上面的输出,也可以看出,有新的订阅者的时候,消息是重新发送的。
在序列的创建与订阅篇我们已经知道冷信号是怎么运行的了,下面我们在继续看一下热信号是怎么实现的。
热信号
我们先来看一个热信号的例子:
func createHotSingle() { |
输出:
2022-10-21 14:57:41.473883+0800 RxDemo[83711:4721445] observer 1: next(🐱) |
接下来我们来看信号是怎么发送和接收的:
首先来看一个类图:
信号发送和接收的过程:
与冷信号不同的是,热信号发送信号是主动的,当发送信号时,会将事件分发给各订阅者。
热信号的销毁与冷信号也有所不同:
- 冷信号的销毁,只能从订阅者层面进行,即销毁订阅者
- 热信号的销毁分为两种:
- 销毁订阅者,将订阅者从信号源的观察者中移出
- 销毁信号源,将不再发出信号
冷热信号的选择
那么在使用过程中,我们怎么选择冷热信号呢?
冷信号只有在被订阅时才会发送元素,适合例如网络请求,被订阅后再去进行网络请求的操作。
当我们根据数据渲染页面时,如果我们将数据源作为信号源,这个时候选择热信号更合适。当信号源发生变化时通知页面更新,数据源可能因为网络请求或者用户的操作发生变化,我们在发生变化时发送信号即可,不需要关心发生变化的原因。