美文网首页程序员
RAC之二(RACReplaySubject)

RAC之二(RACReplaySubject)

作者: RM_乾笙 | 来源:发表于2018-05-29 11:49 被阅读15次
    RACReplaySubject.png

    上图是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再次发送信号,所以这才是为什么先订阅,在发送信号,还是先发送信号再订阅,也能订阅到信息的原因 【如图】

    3

    总结

    综合上述,我们可以了解到,RACReplaySubject比RACSubject 就是多了一步,就是在创建信号的时候多创建了一个valuesReceived数组,在发送信息sendNext的时候将value保存在valuesReceived数组中,订阅的时候,遍历一遍,如果valuesReceived有值就会sendNext发送消息,所以RACReplaySubject可以理解为重复发送消息(订阅时也发送了消息)

    相关文章

      网友评论

        本文标题:RAC之二(RACReplaySubject)

        本文链接:https://www.haomeiwen.com/subject/yzpojftx.html