1.RAC之RACSignal

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)部查看底層做了什么

屏幕快照 2017-05-27 上午1.44.16.png

屏幕快照 2017-05-27 上午1.55.25.png

從上面可以看出,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)部

屏幕快照 2017-05-27 上午2.15.55.png

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

屏幕快照 2017-05-27 上午2.17.28.png

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

屏幕快照 2017-05-27 上午2.16.12.png

主要看我標(biāo)識(shí)的那里,self.didSubscribe 就是前面 createSignal 保存的block,然后就調(diào)用這個(gè)block。

最后,看一下 sendNext:(訂閱者發(fā)送信號(hào)) 內(nèi)部發(fā)生了什么

屏幕快照 2017-05-27 上午2.35.33.png

非常簡(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ù)。

  1. 訂閱者發(fā)送信號(hào)
    訂閱者直接調(diào)用保存的nextBlock().
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容