ReactiveCocoa 作為GitHub出品一個(gè)重量級(jí)的框架,即使目前公司還沒(méi)用MVVM+RAC架構(gòu),但是學(xué)習(xí)一下ReactiveCocoa還是很有必要的。在此,記錄下我學(xué)習(xí)ReactiveCocoa的行程。
RACSignal 使用步驟:
步驟1:創(chuàng)建信號(hào)
+(RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe;步驟2:訂閱信號(hào),只有訂閱了信號(hào),才會(huì)激活信號(hào)
-(RACDisposable *)subscribeNext:(void (^)(id x))nextBlock;步驟3:發(fā)送信號(hào)
-(void)sendNext:(id)value;
例子
// 步驟1.創(chuàng)建信號(hào)
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// block調(diào)用時(shí)刻:當(dāng)執(zhí)行下面步驟2訂閱信號(hào)的時(shí)候,就會(huì)調(diào)用當(dāng)前這個(gè)block
// 步驟3.發(fā)送信號(hào)
// [subscriber sendNext:@1];
// 如果不在發(fā)送數(shù)據(jù),最好發(fā)送信號(hào)完成,內(nèi)部會(huì)自動(dòng)調(diào)用[RACDisposable disposable]取消訂閱信號(hào)。
[subscriber sendCompleted];
return [RACDisposable disposableWithBlock:^{
//block調(diào)用時(shí)刻:當(dāng)信號(hào)發(fā)送完成或者發(fā)送錯(cuò)誤,就會(huì)自動(dòng)執(zhí)行這個(gè)block,取消訂閱信號(hào)。
// 執(zhí)行完Block后,當(dāng)前信號(hào)就不在被訂閱了。
NSLog(@"信號(hào)被銷毀");
}];
}];
// 步驟2.訂閱信號(hào),才會(huì)激活信號(hào)
[signal subscribeNext:^(id x) {
// block調(diào)用時(shí)刻:當(dāng)執(zhí)行上面步驟3 發(fā)送信號(hào)的時(shí)候,就會(huì)調(diào)用當(dāng)前這個(gè)block
NSLog(@"接收到數(shù)據(jù):%@",x);
}];
看一下RACSignal底層做了些什么
command + click 進(jìn)入 createSignal(創(chuàng)建信號(hào)) 內(nèi)部查看底層做了什么


從上面可以看出,RACSignal createSignal: 其實(shí)是在底層創(chuàng)建了一個(gè) RACDynamicSignal 信號(hào)類對(duì)象,并將參數(shù)didSubscribe (block)保存到這個(gè)RACDynamicSignal信號(hào)類對(duì)象中 (signal->_didSubscribe = [didSubscribe copy])。
command + click 進(jìn)入 subscribeNext(訂閱信號(hào)) 內(nèi)部

可以看到, subscribeNext 在底層幫我們創(chuàng)建了一個(gè) RACSubscriber 訂閱者, RACSubscriber 訂閱者 用來(lái)保存 nextBlock。接著繼續(xù)查看 subscribe 內(nèi)部

點(diǎn)擊subscribe 方法發(fā)現(xiàn)有很多個(gè)對(duì)象都調(diào)用了 subscribe 這個(gè)方法,但是,我們上面已經(jīng)說(shuō)過(guò)了,RACSignal底層其實(shí)創(chuàng)建的是 RACDynamicSignal 對(duì)象,所以,我們選擇 RACDynamicSignal subscribe:

主要看我標(biāo)識(shí)的那里,self.didSubscribe 就是前面 createSignal 保存的block,然后就調(diào)用這個(gè)block。
最后,看一下 sendNext:(訂閱者發(fā)送信號(hào)) 內(nèi)部發(fā)生了什么

非常簡(jiǎn)單,一目了然,就是直接調(diào)用放在 RACSubscriber 訂閱者中的 nextBlock.
總結(jié)RACSignal:
1.創(chuàng)建信號(hào),其實(shí)就是創(chuàng)建一個(gè)RACDynamicSignal,并把傳入的 didSubscribe(),didSubscribe 是一個(gè)block, 保存在 RACDynamicSignal中。
didSubscribe (block)定義: (RACDisposable * (^)(id<RACSubscriber> subscriber)) didSubscribe
返回一個(gè) RACDisposable對(duì)象,參數(shù)是一個(gè) RACSubscriber 訂閱者對(duì)象
2.訂閱信號(hào),有兩步
2-1:創(chuàng)建一個(gè) RACSubscriber 訂閱者對(duì)象,把nextBlock保存到這個(gè)訂閱者對(duì)象中。
2-2:調(diào)用 保存在 RACDynamicSignal 中的 didSubscribe(), RACSubscriber 作為 didSubscribe 的參數(shù)。
- 訂閱者發(fā)送信號(hào)
訂閱者直接調(diào)用保存的nextBlock().