RAC中的RACMulticastConnection

看rac的文檔介紹說(shuō)的是,對(duì)于指定信號(hào)的一次訂閱share給其他的訂閱者。簡(jiǎn)單點(diǎn)就是一次訂閱多次使用,錯(cuò)過(guò)了就錯(cuò)過(guò)了。先說(shuō)下冷信號(hào)和熱信號(hào):

    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冷信號(hào)%@", x);
    }];
    
    [coldSignal subscribeNext:^(id x) {
        NSLog(@"訂閱者2冷信號(hào)%@", x);
    }];

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

    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熱信號(hào)%@", x);
        }];
    }];
    
    [[RACScheduler mainThreadScheduler] afterDelay:1.5f schedule:^{
        [hotSignal subscribeNext:^(id x) {
            NSLog(@"訂閱者2熱信號(hào)%@", x);
        }];
    }];

2016-02-01 11:26:34.091 demo[2116:76297] 訂閱者1熱信號(hào)1
2016-02-01 11:26:35.175 demo[2116:76297] 訂閱者1熱信號(hào)2
2016-02-01 11:26:35.176 demo[2116:76297] 訂閱者2熱信號(hào)2
可見(jiàn)didSubscribe這個(gè)block只走了一次,后面的訂閱者錯(cuò)過(guò)前面的send next,就不會(huì)重新發(fā)送。
下面開(kāi)始看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) {
//可見(jiàn)到核心的代碼也就是上面試驗(yàn)的
        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)容合作請(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)容