ReactiveCocoa入門(mén)篇 (三)

前言

在這里說(shuō)說(shuō)當(dāng)有多個(gè)訂閱者,但是我們只想發(fā)送一個(gè)信號(hào)的時(shí)候怎么辦?

我們就可以用RACMulticastConnection,來(lái)實(shí)現(xiàn)

welcome.jpg

先來(lái)上demo鏈接https://github.com/muyang00/YERACDemo.git

RACMulticastConnection使用步驟

  • 1、創(chuàng)建信號(hào) +(RACSignal)createSignal
  • 2、創(chuàng)建連接 RACMulticastConnection *connect = [signal publish];
  • 3、訂閱信號(hào),注意:訂閱的不再是之前的信號(hào),而是連接的信號(hào) [connect.signal subscribeNext];
  • 4、連接 [connect connect];

淺談RACMulticastConnection底層原理

  • 1、 創(chuàng)建connect,connect.sourceSignal -> RACSignal(原始信號(hào)) connect.signal -> RACSubject
  • 2、 訂閱connect.signal,會(huì)調(diào)用RACSubject的subscribeNext,創(chuàng)建訂閱者,而且把訂閱者保存起來(lái),不會(huì)執(zhí)行block。
  • 3、 [connect connect]內(nèi)部會(huì)訂閱RACSignal(原始信號(hào)),并且訂閱者是RACSubject
    3.1、 訂閱原始信號(hào),就會(huì)調(diào)用原始信號(hào)中的didSubscribe
    3.2、 didSubscribe,拿到訂閱者調(diào)用sendNext,其實(shí)是調(diào)用RACSubject的sendNext
  • 4、 RACSubject的sendNext,會(huì)遍歷RACSubject所有訂閱者發(fā)送信號(hào)。
    4.1、 因?yàn)閯倓偟诙剑际窃谟嗛哛ACSubject,因此會(huì)拿到第二步所有的訂閱者,調(diào)用他們的nextBlock

直接上干貨了

 RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // didSubscribeblock中的代碼都統(tǒng)稱(chēng)為副作用。
        // 發(fā)送請(qǐng)求---比如afn
        NSLog(@"發(fā)送請(qǐng)求啦");
        // 發(fā)送信號(hào)
        [subscriber sendNext:@"信號(hào)"];
        return nil;
    }];
    [signal subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
    [signal subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
    [signal subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];

打印結(jié)果為:

image1.png
但是這樣有個(gè)問(wèn)題沒(méi)訂閱一次信號(hào)就得重新創(chuàng)建并發(fā)送請(qǐng)求,這樣很不友好

so

使用RACMulticastConnection,無(wú)論有多少個(gè)訂閱者,無(wú)論訂閱多少次,我只發(fā)送一個(gè)。

  // 1.發(fā)送請(qǐng)求,用一個(gè)信號(hào)內(nèi)包裝,不管有多少個(gè)訂閱者,只想發(fā)一次請(qǐng)求
    RACSignal *resignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // 發(fā)送請(qǐng)求
        NSLog(@"注意啦,我只發(fā)一次請(qǐng)求");
        // 發(fā)送信號(hào)
        [subscriber sendNext:@"信號(hào)"];
        return nil;
    }];
    //2. 創(chuàng)建連接類(lèi)
    RACMulticastConnection *connection = [resignal publish];
    [connection.signal subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
    [connection.signal subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
    [connection.signal subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
    //3. 連接。只有連接了才會(huì)把信號(hào)源變?yōu)闊嵝盘?hào)
    [connection connect];

打印結(jié)果為:

image2.png

最后

不積跬步,無(wú)以至千里;不積小流,無(wú)以成江海

最后編輯于
?著作權(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)容