日常知识点收集

RACSubject及其底层实现

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

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

上一篇下一篇

猜你喜欢

热点阅读