RACMulticastConnection

RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
    NSLog(@"-----");
   [subscriber sendNext:@"test"];
   return [RACDisposable disposableWithBlock:^{
       NSLog(@"disposabled");
   }];
}];

RACMulticastConnection *connection = [signal publish];
[connection.signal subscribeNext:^(id  _Nullable x) {
    NSLog(@"1--%@",x);
}];
[connection.signal subscribeNext:^(id  _Nullable x) {
    NSLog(@"2--%@",x);
}];
[connection connect];

打印結(jié)果:
ReactiveCocoa[6757:757221] -----
ReactiveCocoa[6757:757221] 1--test
ReactiveCocoa[6757:757221] 2--test
ReactiveCocoa[6757:757221] disposabled

[signal publish]的實(shí)現(xiàn):

- (RACMulticastConnection *)publish {
    RACSubject *subject = [[RACSubject subject] setNameWithFormat:@"[%@] -publish", self.name];
    RACMulticastConnection *connection = [self multicast:subject];
    return connection;
}

- (RACMulticastConnection *)multicast:(RACSubject *)subject {
    [subject setNameWithFormat:@"[%@] -multicast: %@", self.name, subject.name];
    RACMulticastConnection *connection = [[RACMulticastConnection alloc] initWithSourceSignal:self subject:subject];
    return connection;
}

- (instancetype)initWithSourceSignal:(RACSignal *)source subject:(RACSubject *)subject {
    NSCParameterAssert(source != nil);
    NSCParameterAssert(subject != nil);

    self = [super init];
    //sourceSignal存放的是最開(kāi)始創(chuàng)建
    _sourceSignal = source;
    _serialDisposable = [[RACSerialDisposable alloc] init];
    // RACMulticastConnection的signal是publish方法創(chuàng)建的subject
    _signal = subject;
    
    return self;
}

signal調(diào)用publish 方法創(chuàng)建了一個(gè)RACSubject對(duì)象,然后將signal和新建的subject作為參數(shù)創(chuàng)建了RACMulticastConnection對(duì)象,connection對(duì)象的兩個(gè)成員變量_sourceSignal和_signal分別接收之前創(chuàng)建的signal和subject對(duì)象。

所以[connection.signal subscribeNext:]本質(zhì)上是調(diào)用RACSubject的subscribeNext:方法將訂閱者添加到屬性subscribers中。

最后查看connect方法的實(shí)現(xiàn):


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

   if (shouldConnect) {
       self.serialDisposable.disposable = [self.sourceSignal subscribe:_signal];
   }

   return self.serialDisposable;
}

connect方法實(shí)現(xiàn)就是調(diào)用最初創(chuàng)建的signal的subscribe:方法,而參數(shù)subscriber則是publish方法中創(chuàng)建的subject。所以調(diào)用connect方法會(huì)觸發(fā)signal的block,subscriber會(huì)發(fā)生消息,因?yàn)閟ubscriber是subject對(duì)象,所以會(huì)遍歷subscribers給每個(gè)訂閱者發(fā)送消息,所以只打印了一次'-----'。

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

  • ReactiveCocoa 中的信號(hào)信號(hào)在默認(rèn)情況下都是冷的,每次有新的訂閱者訂閱信號(hào)時(shí)都會(huì)執(zhí)行信號(hào)創(chuàng)建時(shí)傳入的 ...
    d5cbd4f07363閱讀 594評(píng)論 0 0
  • RAC在iOS的實(shí)際開(kāi)發(fā)中確實(shí)是一件有力的武器,此文將從以下幾方面講解 RACSignal RACSubject ...
    4b5cb36a2ee2閱讀 1,033評(píng)論 0 0
  • 前言 之前對(duì)RAC有了一個(gè)基本的認(rèn)識(shí),了解了它的作用,以及RAC的運(yùn)行機(jī)制,我們知道只要是信號(hào)(RACSignal...
    大大盆子閱讀 4,625評(píng)論 0 11
  • 1.ReactiveCocoa簡(jiǎn)介 ReactiveCocoa(簡(jiǎn)稱為RAC),是由Github開(kāi)源的一個(gè)應(yīng)用于i...
    亂了夏末丶藍(lán)了海閱讀 922評(píng)論 0 0
  • 一直遇到好人,讓我覺(jué)得自己活著非常幸運(yùn)。無(wú)論是養(yǎng)育我的父母,還是我成長(zhǎng)路上遇見(jiàn)的朋友。 “沒(méi)有人會(huì)害你,這樣好好地...
    冷咲閱讀 475評(píng)論 0 0

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