上一篇文章 我们了解了RACSignal及其底层实现,这篇文章我们来了解一下RACSubject及其底层实现。
开始之前,补充一点上节遗漏点:冷信号和热信号
冷信号:
RAC中的RACSiganl类中几乎都是冷信号,使用RACSignal初始化一个RACDynamicSignal对象,如果没有订阅者的话,该对象一直不会被调用,孤孤单单冷冷清清一个人,这就是冷信号。(只要没有订阅者调用,就是冷信号)
热信号:
明白了冷信号,那热信号也就很明显了:即使没有订阅者也是会发送消息。
好了,现在开始撸RACSubject
创建Xcode工程,导入 'ReactiveObjC','~>3.0.0' (这个是OC版本的RAC),在controller中引入#import <ReactiveObjC.h>,代码很简单,下面一张截图就展示完了
RACSubject底层实现
先上一张底层实现流程图:
1、创建信号:代码截图中第33行,点击进去,发现它重写了init方法,在init方法中,它干了两件事:
1)、创建了RACCompoundDisposable(RACCompoundDisposable继承自RACDisposable),在 dealloc发放中会取消订阅清除相关资源;
2)、创建了一个数组 _subscribers ,作用接下来会说到。
+ (instancetype)subject {
return [[self alloc] init];
}
- (instancetype)init {
self = [super init];
if (self == nil) return nil;
_disposable = [RACCompoundDisposable compoundDisposable];
_subscribers = [[NSMutableArray alloc] initWithCapacity:1];
return self;
}
2、订阅信号
这一部分和 RACSignal底层实现 的订阅信号一样,有相关的截图,更加清晰;唯一不同的是 [self subscribe:o] 中的self是 RACSubject,下图第60行代码中取得就是创建信号时重写init方法中创建的数组,拿到这个数组之后,将我们创建的订阅者保存进去。
3、发送信号
进入方法中可以看到,通过遍历找出 subscriber ,然后进行发送数据。接收信号和开篇中所说的上一篇中接收信号一致。
- (void)sendNext:(id)value {[self enumerateSubscribersUsingBlock:^(id subscriber) {
[subscriber sendNext:value];
}];
}
- (void)enumerateSubscribersUsingBlock:(void (^)(idsubscriber))block {NSArray *subscribers;@synchronized (self.subscribers) {subscribers = [self.subscribers copy];}for (id subscriber in subscribers) {
block(subscriber);
}
}
至此,RACSubject的底层实现过程已经很清晰了。希望对小伙伴们有所帮助。