1、RACReplaySubject
前面的文章我们说到RACSubject既可以 创建信号 又可以 订阅信号 还可以 发送信号,下面我们来看看RACReplaySubject是用来干什么的。
只要用到RAC绝对逃不过三部曲:
1、创建信号
2、订阅信号
3、发送信号
//1.创建信号
RACReplaySubject *subject = [RACReplaySubject subject];
//2.订阅信号
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"%@", x);
}];
//3.发送信号
[subject sendNext:@"我在发送信号"];
我们看到 RACReplaySubject 的用法和 RACSubject 差不多,外层代码看起来一样,但是其内部实现原理还是有些许的差别,首先我们知道 RACReplaySubject 是继承于 RACSubject 的,所以说创建信号的原理是一样的,接下来我们看一下订阅信号两者有何不同
[subject subscribeNext:^(id _Nullable x) { NSLog(@"%@", x); }];
这两者有何不同? 我们点击subscribeNext这个方法中查看一下,如下代码,方法是一样,那有何不同?不同在于一个[self subscribe:0]这行代码,我们知道子类调用这个方法的时候肯定会覆盖父类的方法,所以我们看看子类的实现方法和父类的实现方法有何不同?
- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock {
NSCParameterAssert(nextBlock != NULL);
RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:NULL completed:NULL];
return [self subscribe:o];
}
有一点很不一样的就是在初始化的时候subject方法会创建一个数组,而在subscriber这个方法中他遍历了数组(也就是订阅者),而且只要数据中有值就直接发送数据,那么作者为什么要这么做呢!那是因为有一种情况就是使用者在创建信号的时候需要发送信号,而RACReplaySubject帮你把发送信号保存在了一个数组里面,当你订阅的时候马上就能收到消息。
--------------------- subscribe 方法 ----------------------
- (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber {
RACCompoundDisposable *compoundDisposable = [RACCompoundDisposable compoundDisposable];
RACDisposable *schedulingDisposable = [RACScheduler.subscriptionScheduler schedule:^{
@synchronized (self) {
for (id value in self.valuesReceived) {
if (compoundDisposable.disposed) return;
[subscriber sendNext:(value == RACTupleNil.tupleNil ? nil : value)];
}
if (compoundDisposable.disposed) return;
if (self.hasCompleted) {
[subscriber sendCompleted];
} else if (self.hasError) {
[subscriber sendError:self.error];
} else {
RACDisposable *subscriptionDisposable = [super subscribe:subscriber];
[compoundDisposable addDisposable:subscriptionDisposable];
}
}
}];
[compoundDisposable addDisposable:schedulingDisposable];
return compoundDisposable;
}
demo源代码已放置GitHub地址https://github.com/JunAILiang/RAC_Demo
联系我:
qq: 1245424073
微信: liujunmin6980
网友评论