RAC中的RACMulticastConnection

看rac的文檔介紹說的是,對于指定信號的一次訂閱share給其他的訂閱者播掷。簡單點就是一次訂閱多次使用季二,錯過了就錯過了。先說下冷信號和熱信號:

    RACSignal *coldSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [[RACScheduler mainThreadScheduler] afterDelay:1.0f schedule:^{
            [subscriber sendNext:@"1"];
        }];
        
        [[RACScheduler mainThreadScheduler] afterDelay:2.0f schedule:^{
            [subscriber sendNext:@"2"];
        }];
        
        return nil;
    }];
    
    [coldSignal subscribeNext:^(id x) {
        NSLog(@"訂閱者1冷信號%@", x);
    }];
    
    [coldSignal subscribeNext:^(id x) {
        NSLog(@"訂閱者2冷信號%@", x);
    }];

2016-02-01 10:56:22.271 demo[1897:64769] 訂閱者1冷信號1
2016-02-01 10:56:22.320 demo[1897:64769] 訂閱者2冷信號1
2016-02-01 10:56:23.447 demo[1897:64769] 訂閱者1冷信號2
2016-02-01 10:56:23.448 demo[1897:64769] 訂閱者2冷信號2
可見每次訂閱都會走didSubscribe這個block舀寓,下面將冷信號轉(zhuǎn)化為熱信號

    RACSignal *coldSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [[RACScheduler mainThreadScheduler] afterDelay:1.0f schedule:^{
            [subscriber sendNext:@"1"];
        }];
        
        [[RACScheduler mainThreadScheduler] afterDelay:2.0f schedule:^{
            [subscriber sendNext:@"2"];
        }];
        
        return nil;
    }];
    
    RACSubject *hotSignal = [RACSubject subject];
    [coldSignal subscribe:hotSignal];
    
    [[RACScheduler mainThreadScheduler] afterDelay:0.5f schedule:^{
        [hotSignal subscribeNext:^(id x) {
            NSLog(@"訂閱者1熱信號%@", x);
        }];
    }];
    
    [[RACScheduler mainThreadScheduler] afterDelay:1.5f schedule:^{
        [hotSignal subscribeNext:^(id x) {
            NSLog(@"訂閱者2熱信號%@", x);
        }];
    }];

2016-02-01 11:26:34.091 demo[2116:76297] 訂閱者1熱信號1
2016-02-01 11:26:35.175 demo[2116:76297] 訂閱者1熱信號2
2016-02-01 11:26:35.176 demo[2116:76297] 訂閱者2熱信號2
可見didSubscribe這個block只走了一次,后面的訂閱者錯過前面的send next肌蜻,就不會重新發(fā)送互墓。
下面開始看RACMulticastConnection的源碼:

//初始化操作
- (id)initWithSourceSignal:(RACSignal *)source subject:(RACSubject *)subject {
    NSCParameterAssert(source != nil);
    NSCParameterAssert(subject != nil);

    self = [super init];
    if (self == nil) return nil;

    _sourceSignal = source;
    _serialDisposable = [[RACSerialDisposable alloc] init];
    _signal = subject;
    
    return self;
}

#pragma mark Connecting

- (RACDisposable *)connect {
    BOOL shouldConnect = OSAtomicCompareAndSwap32Barrier(0, 1, &_hasConnected);

    if (shouldConnect) {
//可見到核心的代碼也就是上面試驗的
        self.serialDisposable.disposable = [self.sourceSignal subscribe:_signal];
    }

    return self.serialDisposable;
}

- (RACSignal *)autoconnect {
    __block volatile int32_t subscriberCount = 0;

    return [[RACSignal
        createSignal:^(id<RACSubscriber> subscriber) {
            OSAtomicIncrement32Barrier(&subscriberCount);

            RACDisposable *subscriptionDisposable = [self.signal subscribe:subscriber];
            RACDisposable *connectionDisposable = [self connect];

            return [RACDisposable disposableWithBlock:^{
                [subscriptionDisposable dispose];

                if (OSAtomicDecrement32Barrier(&subscriberCount) == 0) {
                    [connectionDisposable dispose];
                }
            }];
        }]
        setNameWithFormat:@"[%@] -autoconnect", self.signal.name];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蒋搜,隨后出現(xiàn)的幾起案子篡撵,更是在濱河造成了極大的恐慌,老刑警劉巖豆挽,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酸休,死亡現(xiàn)場離奇詭異,居然都是意外死亡祷杈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門渗饮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來但汞,“玉大人宿刮,你說我怎么就攤上這事∷嚼伲” “怎么了僵缺?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長踩叭。 經(jīng)常有香客問我磕潮,道長,這世上最難降的妖魔是什么容贝? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任自脯,我火速辦了婚禮,結(jié)果婚禮上斤富,老公的妹妹穿的比我還像新娘膏潮。我一直安慰自己,他們只是感情好满力,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布焕参。 她就那樣靜靜地躺著,像睡著了一般油额。 火紅的嫁衣襯著肌膚如雪叠纷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天潦嘶,我揣著相機與錄音涩嚣,去河邊找鬼。 笑死衬以,一個胖子當著我的面吹牛缓艳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播看峻,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼阶淘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了互妓?” 一聲冷哼從身側(cè)響起溪窒,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冯勉,沒想到半個月后澈蚌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡灼狰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年宛瞄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片交胚。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡份汗,死狀恐怖盈电,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杯活,我是刑警寧澤匆帚,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站旁钧,受9級特大地震影響吸重,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜歪今,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一嚎幸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧彤委,春花似錦鞭铆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至斯辰,卻和暖如春舶担,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背彬呻。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工衣陶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闸氮。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓剪况,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蒲跨。 傳聞我的和親對象是個殘疾皇子译断,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容