日常知识点收集

RACReplaySubject及其底层实现和RACSubjec

2018-03-26  本文已影响0人  Sheldon_WDG

1、RACReplaySubject底层实现

1、重写了父类方法,创建信号时候,内部创建了_subscriber数组 和 _valuesReceived(用来限制缓存的value的数量,只保存最新的设置的数量,默认为保存所有);

+ (instancetype)replaySubjectWithCapacity:(NSUInteger)capacity {

return [(RACReplaySubject *)[self alloc] initWithCapacity:capacity];

}

- (instancetype)init {

return [self initWithCapacity:RACReplaySubjectUnlimitedCapacity];

}

- (instancetype)initWithCapacity:(NSUInteger)capacity {

self = [super init];

_capacity = capacity;

_valuesReceived = (capacity == RACReplaySubjectUnlimitedCapacity ? [NSMutableArray array] : [NSMutableArray arrayWithCapacity:capacity]);

return self;

}

2、订阅信号和RACSubject类似,都是拿到_subscriber数组,将我们创建的订阅者保存进去;

3、发送数据,第一步和RACSubject一样,拿到第二部中的数组,进行遍历找到订阅者,发送数据,执行nextBlock;判断是否超出缓存的个数(第一步创建信号时候赋值),进行删除保存。

- (void)sendNext:(id)value {
    @synchronized (self) {
        [self.valuesReceived addObject:value ?: RACTupleNil.tupleNil];
        [super sendNext:value];
       
        if (self.capacity != RACReplaySubjectUnlimitedCapacity && self.valuesReceived.count > self.capacity) {
            [self.valuesReceived removeObjectsInRange:NSMakeRange(0, self.valuesReceived.count - self.capacity)];
        }
    }
}

2、RACReplaySubject和RACSubject的区别

RACSubject:信号提供者,自己可以充当信号,又能发送信号。

使用场景:通常用来代替代理,有了它,就不必要定义代理了。

RACReplaySubject:重复提供信号类,RACSubject的子类。

RACReplaySubject与RACSubject区别:RACReplaySubject可以先发送信号,再订阅信号;RACSubject就不可以。

使用场景一:如果一个信号每被订阅一次,就需要把之前的值重复发送一遍,使用重复提供信号类。

使用场景二:可以设置capacity数量来限制缓存的value的数量,即只缓充最新的几个值

上一篇下一篇

猜你喜欢

热点阅读