RACSubject及其底层实现

上一篇文章 我们了解了RACSignal及其底层实现,这篇文章我们来了解一下RACSubject及其底层实现。

开始之前,补充一点上节遗漏点:冷信号和热信号

冷信号:

RAC中的RACSiganl类中几乎都是冷信号,使用RACSignal初始化一个RACDynamicSignal对象,如果没有订阅者的话,该对象一直不会被调用,孤孤单单冷冷清清一个人,这就是冷信号。(只要没有订阅者调用,就是冷信号)

热信号:

明白了冷信号,那热信号也就很明显了:即使没有订阅者也是会发送消息。


好了,现在开始撸RACSubject

创建Xcode工程,导入 'ReactiveObjC','~>3.0.0' (这个是OC版本的RAC),在controller中引入#import ,代码很简单,下面一张截图就展示完了



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的底层实现过程已经很清晰了。希望对小伙伴们有所帮助。

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