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的這一特性。
