美文网首页源码解析
RACMulticastConnection

RACMulticastConnection

作者: 哦呵呵y | 来源:发表于2018-04-24 16:59 被阅读6次

    系列文章
    RACSignal,RACSubject,RACReplaySubject
    RAC bind
    RAC Merge flatten
    RACMulticastConnection
    RAC switchToLatest

    多次订阅信号,则会多次调用创建信号时的block,如果想要多次订阅,只会调用一次,就需要用到RACMulticastConnection类。

        RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            NSLog(@"订阅");
            [subscriber sendNext:@"a"];
            return nil;
        }];
        RACMulticastConnection *connect = [signal publish];
        [connect.signal subscribeNext:^(id x) {
            NSLog(@"1 - %@",x);
        }];
        [connect.signal subscribeNext:^(id x) {
            NSLog(@"2 - %@",x);
        }];
        [connect.signal subscribeNext:^(id x) {
            NSLog(@"3 - %@",x);
        }];
        [connect connect];
    ...
    // connect 内部实现
    - (RACDisposable *)connect {
        BOOL shouldConnect = OSAtomicCompareAndSwap32Barrier(0, 1, &_hasConnected);
    
        if (shouldConnect) {
            self.serialDisposable.disposable = [self.sourceSignal subscribe:_signal];
        }
    
        return self.serialDisposable;
    }
    

    RACMulticastConnection 实现步骤

    1. [signal publish] 会生成一个 RACMulticastConnection 对象, connect内部会生成一个RACSubject对象保存为 signal ,将原signal保存为sourceSignal
    2. 后面对 connect.signal进行订阅,其实是对connect内部的RACSubject对象进行订阅。
    3. 当调用[connect connect];时,通过[self.sourceSignal subscribe:_signal] 方法将RACSubject对象作为原信号的订阅者,这是原信号创建时的block才会调用,通过OSAtomicCompareAndSwap32Barrier(0, 1, &_hasConnected)也保证了,此方法只会执行一次
    4. 此时原信号创建时的block内部传入的订阅者就是connect.signal(RACSubject),然后订阅者发送信号,所有订阅者都会收到消息。

    相关文章

      网友评论

        本文标题:RACMulticastConnection

        本文链接:https://www.haomeiwen.com/subject/jtbjlftx.html