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给每个订阅者发送消息,所以只打印了一次'-----'。
网友评论