上图是RACSubject和RACReplaySubejct订阅信号的方法,RACReplaySubject是继承自RACSubject,所以RACReplaySubject既可以当做信号又可发送信号
,但与RACSubject不同的是,RACSubject必须先订阅信号后发送信号,但RACReplaySubject既可以先订阅信号后发送信号,又可以先发送信号后订阅信号
,即
1. 创建信号-订阅信号-发送信号
2. 创建信号-发送信号-订阅信号
RACReplaySubject用此两种方式都可以订阅到发出的信号。
源码分析
1.创建信号
RACReplaySubject 调用父类方法subject创建([[self alloc] init]),RACReplaySubject里重写了init方法,做的操作有 【如下图】
1.capacity赋值
2.初始化valuesReceived
1
2.发送信号
RACReplaySubject 发送信号时主要做了两件事 【如下图】
1.把要发送的消息添加到valuesReceived数组中
2.遍历所有订阅者,把消息发送出去。
2
3.订阅信号
RACReplaySubject 订阅信号时,主要比RACSubject多做了一个步骤,就是如果遍历self.valuesReceived,如果valuesReceived有值,则调用sendNext再次发送信号,所以这才是为什么先订阅,在发送信号,还是先发送信号再订阅,也能订阅到信息的原因
【如图】
总结
综合上述,我们可以了解到,RACReplaySubject比RACSubject 就是多了一步,就是在创建信号的时候多创建了一个valuesReceived数组,在发送信息sendNext的时候将value保存在valuesReceived数组中,订阅的时候,遍历一遍,如果valuesReceived有值就会sendNext发送消息,所以RACReplaySubject可以理解为重复发送消息(订阅时也发送了消息)
网友评论