美文网首页
RACMulticastConnection

RACMulticastConnection

作者: YY_Lee | 来源:发表于2019-11-29 15:37 被阅读0次
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给每个订阅者发送消息,所以只打印了一次'-----'。

相关文章

网友评论

      本文标题:RACMulticastConnection

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