上一篇文章 我們了解了RACSignal及其底層實(shí)現(xiàn),這篇文章我們來了解一下RACSubject及其底層實(shí)現(xiàn)秧均。
開始之前,補(bǔ)充一點(diǎn)上節(jié)遺漏點(diǎn):冷信號(hào)和熱信號(hào)
冷信號(hào):
RAC中的RACSiganl類中幾乎都是冷信號(hào),使用RACSignal初始化一個(gè)RACDynamicSignal對(duì)象,如果沒有訂閱者的話描睦,該對(duì)象一直不會(huì)被調(diào)用膊存,孤孤單單冷冷清清一個(gè)人导而,這就是冷信號(hào)忱叭。(只要沒有訂閱者調(diào)用,就是冷信號(hào))
熱信號(hào):
明白了冷信號(hào)今艺,那熱信號(hào)也就很明顯了:即使沒有訂閱者也是會(huì)發(fā)送消息韵丑。
好了,現(xiàn)在開始擼RACSubject
創(chuàng)建Xcode工程虚缎,導(dǎo)入 'ReactiveObjC','~>3.0.0' (這個(gè)是OC版本的RAC)撵彻,在controller中引入#import <ReactiveObjC.h>,代碼很簡單实牡,下面一張截圖就展示完了
RACSubject底層實(shí)現(xiàn)
先上一張底層實(shí)現(xiàn)流程圖:
1陌僵、創(chuàng)建信號(hào):代碼截圖中第33行,點(diǎn)擊進(jìn)去创坞,發(fā)現(xiàn)它重寫了init方法碗短,在init方法中,它干了兩件事:
1)题涨、創(chuàng)建了RACCompoundDisposable(RACCompoundDisposable繼承自RACDisposable)偎谁,在 dealloc發(fā)放中會(huì)取消訂閱清除相關(guān)資源;
2)纲堵、創(chuàng)建了一個(gè)數(shù)組 _subscribers 巡雨,作用接下來會(huì)說到。
+ (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席函、訂閱信號(hào)
這一部分和 RACSignal底層實(shí)現(xiàn) 的訂閱信號(hào)一樣铐望,有相關(guān)的截圖,更加清晰向挖;唯一不同的是 [self subscribe:o] 中的self是 RACSubject蝌以,下圖第60行代碼中取得就是創(chuàng)建信號(hào)時(shí)重寫init方法中創(chuàng)建的數(shù)組,拿到這個(gè)數(shù)組之后何之,將我們創(chuàng)建的訂閱者保存進(jìn)去跟畅。
3、發(fā)送信號(hào)
進(jìn)入方法中可以看到溶推,通過遍歷找出 subscriber 徊件,然后進(jìn)行發(fā)送數(shù)據(jù)。接收信號(hào)和開篇中所說的上一篇中接收信號(hào)一致蒜危。
- (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的底層實(shí)現(xiàn)過程已經(jīng)很清晰了。希望對(duì)小伙伴們有所幫助辐赞。