冷热信号

冷热信号区别:

  • 热信号是主动的,即使你没有订阅事件,它仍然会时刻推送
  • 而冷信号是被动的,只有当你订阅的时候,它才会发送消息

  • 热信号可以有多个订阅者,是一对多,信号可以与订阅者共享信息

  • 而冷信号只能一对一,当有不同的订阅者,消息会重新完整发送,热信号像是一个广播。冷信号像是一个模板,不同的订阅者会生成一个实例

  • 热信号会被所有此刻已订阅的地方各执行一次,以后订阅的地方会错过之前的消息

一个很重要的概念

任何信号的转换即是对原信号订阅从而产生新的信号,这样的话,一个信号被转换或者多处订阅会造成这个信号产生多次,如果是网络请求,则会多次请求

为什么要区分冷热信号呢?

为了防止副作用执行多次,例如数据请求执行多次。例如有一个冷信号有多个订阅者,那么在多个订阅者订阅的时候这个冷信号会被创建多次,如果这个信号的创建伴随着数据的请求,那么这个请求会执行多次。这样很浪费流量,也影响速率。

RACSignal的subscirption
  1. [RACSignal createSignal]来获得signal
  2. [signal subscribNext]来获得subscriber,然后进行subscription。
  3. 进入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

尽量传出来一个冷信号,然后转为热信号用,如果传出热信号,则回不到冷信号了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值