冷热信号区别:
- 热信号是主动的,即使你没有订阅事件,它仍然会时刻推送
- 而冷信号是被动的,只有当你订阅的时候,它才会发送消息
- 热信号可以有多个订阅者,是一对多,信号可以与订阅者共享信息
- 而冷信号只能一对一,当有不同的订阅者,消息会重新完整发送,热信号像是一个广播。冷信号像是一个模板,不同的订阅者会生成一个实例
- 热信号会被所有此刻已订阅的地方各执行一次,以后订阅的地方会错过之前的消息
一个很重要的概念
任何信号的转换即是对原信号订阅从而产生新的信号,这样的话,一个信号被转换或者多处订阅会造成这个信号产生多次,如果是网络请求,则会多次请求
为什么要区分冷热信号呢?
为了防止副作用执行多次,例如数据请求执行多次。例如有一个冷信号有多个订阅者,那么在多个订阅者订阅的时候这个冷信号会被创建多次,如果这个信号的创建伴随着数据的请求,那么这个请求会执行多次。这样很浪费流量,也影响速率。
RACSignal的subscirption
- [RACSignal createSignal]来获得signal
- [signal subscribNext]来获得subscriber,然后进行subscription。
- 进入didSubscribe,通过[subscriber sendNext] 来执行next block。
RAC提供了一些把冷信号转换成热信号的方法:
利用multicast进行冷信号转热信号(最重要的方法,其他的都是间接调用此方法)
通过RACSubject,RACReplaySubject
- (RACMulticastConnection *)publish就是帮忙创建了RACSubject。
- (RACSignal *)replay就是用RACReplaySubject来作为subject,并立即执行connect操作,返回connection.signal。其作用是上面提到的replay功能,即后来的订阅者可以收到历史值。
- (RACSignal *)replayLast就是用Capacity为1的RACReplaySubject来替换- (RACSignal *)replay的`subject。其作用是使后来订阅者只收到最后的历史值。
- (RACSignal *)replayLazily和- (RACSignal *)replay的区别就是replayLazily会在第一次订阅的时候才订阅sourceSignal。
所以,其实本质仍然是
使用一个Subject来订阅原始信号,并让其他订阅者订阅这个Subject,这个Subject就是热信号。
所有的热信号都属于一个类:RACSubject
subject是可变的,是非RAC到RAC的一个桥梁,可以附加行为
subject = 直播 signal = 点播
replaySubject会订阅之前错过的值(可以设置订阅错过的个数)
RACSubject及子类都是热信号,其他都是冷信号。
热信号转换不到冷信号,因为不能满足:每次订阅都重新执行一次block
尽量传出来一个冷信号,然后转为热信号用,如果传出热信号,则回不到冷信号了