RACReplaySubject及其底层实现和RACSubject的区别

1、RACReplaySubject底层实现


RACReplaySubject及其底层实现和RACSubject的区别_第1张图片



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的数量,即只缓充最新的几个值

你可能感兴趣的:(RACReplaySubject及其底层实现和RACSubject的区别)