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];

打印结果:
ReactiveCocoa[6757:757221] -----
ReactiveCocoa[6757:757221] 1--test
ReactiveCocoa[6757:757221] 2--test
ReactiveCocoa[6757:757221] disposabled

[signal publish]的实现:

- (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存放的是最开始创建
    _sourceSignal = source;
    _serialDisposable = [[RACSerialDisposable alloc] init];
    // RACMulticastConnection的signal是publish方法创建的subject
    _signal = subject;
    
    return self;
}

signal调用publish 方法创建了一个RACSubject对象,然后将signal和新建的subject作为参数创建了RACMulticastConnection对象,connection对象的两个成员变量_sourceSignal和_signal分别接收之前创建的signal和subject对象。

所以[connection.signal subscribeNext:]本质上是调用RACSubject的subscribeNext:方法将订阅者添加到属性subscribers中。

最后查看connect方法的实现:


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

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

   return self.serialDisposable;
}

connect方法实现就是调用最初创建的signal的subscribe:方法,而参数subscriber则是publish方法中创建的subject。所以调用connect方法会触发signal的block,subscriber会发生消息,因为subscriber是subject对象,所以会遍历subscribers给每个订阅者发送消息,所以只打印了一次'-----'。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • ReactiveCocoa 中的信号信号在默认情况下都是冷的,每次有新的订阅者订阅信号时都会执行信号创建时传入的 ...
    d5cbd4f07363阅读 581评论 0 0
  • RAC在iOS的实际开发中确实是一件有力的武器,此文将从以下几方面讲解 RACSignal RACSubject ...
    4b5cb36a2ee2阅读 1,028评论 0 0
  • 前言 之前对RAC有了一个基本的认识,了解了它的作用,以及RAC的运行机制,我们知道只要是信号(RACSignal...
    大大盆子阅读 4,586评论 0 11
  • 1.ReactiveCocoa简介 ReactiveCocoa(简称为RAC),是由Github开源的一个应用于i...
    乱了夏末丶蓝了海阅读 907评论 0 0
  • 一直遇到好人,让我觉得自己活着非常幸运。无论是养育我的父母,还是我成长路上遇见的朋友。 “没有人会害你,这样好好地...
    冷咲阅读 459评论 0 0

友情链接更多精彩内容