RACSubject及其底层实现

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 如果你刚看这个系列,有必要看看前面两篇。 股市韭菜生存指南(开篇) 股市韭菜生存指南(一) 今天我们主要来说说投资...
    反脆弱性成长阅读 221评论 0 2
  • 英雄自古岀磨难,薄命红颜系祸端。 一代伟人纠谬误,女人始顶半边天。
    徐一村阅读 400评论 6 23
  • 一条船 从此岸出港 航行在浩淼的海洋 驶向设定的彼岸 一个人 从第一声啼哭 历经婴幼 成长 衰老 最后离开这个...
    等待戈多0619阅读 288评论 0 0