RAC篇(上) - RACSignal & RACSubject


RACSignal:

這是一個冷信號,每調用一次subscribeNext就會觸發一次 didSubscribe的回調,進行信號的發送。

 

-(RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe

 初始化RACDynamicSignal對象,且RACDynamicSignal會用copy的方式持有didSubscribe這個block。稍后在RACDynamicSignal中調用.

 

當有調用

- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock error:(void (^)(NSError *error))errorBlock completed:(void (^)(void))completedBlock

會初始化RACSubscriber對象,Subscriber我們一般稱之為訂閱者,它負責處理Signal傳出的數據。RACSubscriber會用copy的方式持有nextBlock、errorBlock、completedBlock。且RACSubscriber內部擁有個RACCompoundDisposable,在調用RACCompoundDisposable的dispose的時候,會對nextBlock、errorBlock、completedBlock進行清空處理。接着調用:

- (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber

傳遞這個RACSubscriber到RACDynamicSignal中,初始化RACCompoundDisposable對象。並調用RACPassthroughSubscriber的初始化方法:

- (instancetype)initWithSubscriber:(id<RACSubscriber>)subscriber signal:(RACSignal *)signal disposable:(RACCompoundDisposable *)disposable
RACPassthroughSubscriber對象以strong的方式持有subscriber、disposable,以unsafe_unretained的方式持有signal。

緊接着調用RACDynamicSignal中在createSignal時傳入didSubscribeBlock,這是一個block,傳遞的其實是上面創建的RACPassthroughSubscriber,在調用RACDynamicSignal的sendnext方法,調用RACPassthroughSubscriber的innerSubscribe的RACSubscriber中sendnext方法。接着觸發RACSubscriber的nextblock。

RACSubject:
熱信號是主動的,即使你沒有訂閱事件,它仍然會時刻推送。熱信號可以有多個訂閱者,是一對多,信號可以與訂閱者共享信息。
[RACSubject subject];
進行初始化過程,設置兩個屬性值:RACCompoundDisposable和subscribers(subscriber訂閱者容器)
通過調用
- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock error:(void (^)(NSError *error))errorBlock completed:(void (^)(void))completedBlock;

 - (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber;

添加訂閱者。

[RACSubject sendNext:];

來發送信號數據。遍歷當前擁有的所有訂閱者,調用id<RACSubscriber> 的sendNext(),觸發nextBlock。

RACReplySubject:

跟RACSubject相比,多了一點“記憶功能”,通過valuesReceived數組保存之前發送的數據,再添加新的訂閱者的時候能夠拿到歷史數據。
 

有時為了消滅副作用或着其它某種原因,我們需要將冷信號轉成熱信號,讓它具備熱信號的特性。 這時候我們可以用到[RACDynamicSignal multicast: RACSubject] ,這個方法究其原理也是利用到了RACSubject可隨時sendNext的這一特性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM