信号signal是RAC的绝对核心,所有的操作都是围绕着信号来处理的。
比如:创建信号,订阅信号,发送信号是消息发送的核心步骤。
常见的三个信号类为:
- RACSignal
- RACSubject
- RACReplaySubject
一、RACSignal
代码实现:
|
|
使用步骤:
1.创建信号
|
|
|
|
2.订阅信号
(激活信号,冷信号编程热信号)
- (RACDisposable *)subscribeNext:(void (^ )(id x))nextBlock;
|
|
3.发送信号
订阅信号时,将subscriber传递给didSubscribe的参数subscriber
利用[subscriber sendNext:@1]方法发送信号。
|
|
RACSignal原理流程图:
RACSignal总结:
三步骤(先创建信号,然后订阅信号,最后执行didSubscribe内部的方法)顺序是不能变的。
>
RACSignal底层实现:
* 1.创建信号,首先把didSubscribe保存到信号中,还不会触发。 * 2.当信号被订阅,也就是调用signal的subscribeNext:nextBlock 2.1 subscribeNext内部会创建订阅者subscriber,并且把nextBlock保存到subscriber中。 2.2 subscribeNext内部会调用siganl的didSubscribe * 3.siganl的didSubscribe中调用[subscriber sendNext:@1]; * 3.1 sendNext底层其实就是执行subscriber的nextBlock
二、RACSubject
RACSubject:信号提供者,自己可以充当信号,又能发送信号。
先来简单回顾下,RACSignal类中发送和订阅信号是两步完成的。
|
|
- 疑问:有没有办法让一个对象既能发送也可以发送消息呢?
其实很简单,只要让具有RACSignal对象遵守RACSubscribe协议,就既能发送,又能订阅信号了。
这个类就是RACSubject。虽然和RACSignal一样都具有订阅和发送信号的能力,但其内部原理不同。
下文是对RACSubject类进行剖析。
代码实现
调用顺序不变,但是可以创建多个订阅者,并发送信号;
|
|
源码解析
1.创建信号
|
|
2.订阅信号
不同类型的信号,创建订阅者的方式不同,RACSignal订阅信号时,调用了形影的block。
而RACSubject订阅信号的实质就是将内部创建的订阅者保存在订阅者数组self.subscribers中,仅此而已。订阅者对象有一个名为nextBlock的block参数。
|
|
3.发送信号
底层实现是:
- 先遍历订阅者数组中的订阅者;
- 后执行订阅者中的nextBlock;
- 最后让订阅者发送信号。
|
|
RACSubject原理流程图:
总结
|
|
RACSubject:底层实现和RACSignal不一样。
1.调用subscribeNext订阅信号,只是把订阅者保存起来,并且订阅者的nextBlock已经赋值了。
2.调用sendNext发送信号,遍历刚刚保存的所有订阅者,一个一个调用订阅者的nextBlock。
- 3.由于本质是将订阅者保存到数组中,所以可以有多个订阅者订阅信息。
使用场景:不想监听某个信号时,可以通过它主动取消订阅信号。
RACSubject:信号提供者,自己可以充当信号,又能发送信号。
使用场景:通常用来代替代理,有了它,就不必要定义代理了。
缺点:
还是必须先订阅,后发送信息。订阅信号就是创建订阅者的过程,如果不先订阅,数组中就没有订阅者对象,那就通过订阅者发送消息。
三、RACReplaySubject
介绍
上文中提到了,RACSubject要求先订阅,后发送信号。
##**代码实现:**
|
|
使用步骤:
1.创建信号
|
|
2.订阅信号
遍历拿到保存在数组中的所有值,然后调用subscriber发送信号。
|
|
3.发送信号
|
|
RACReplaySubject原理图
RACReplaySubject总结
RACReplaySubject是RACSubject的子类。
RACReplaySubject使用步骤:
|
|