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];
打印結(jié)果:
ReactiveCocoa[6757:757221] -----
ReactiveCocoa[6757:757221] 1--test
ReactiveCocoa[6757:757221] 2--test
ReactiveCocoa[6757:757221] disposabled
[signal publish]的實(shí)現(xiàn):
- (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存放的是最開(kāi)始創(chuàng)建
_sourceSignal = source;
_serialDisposable = [[RACSerialDisposable alloc] init];
// RACMulticastConnection的signal是publish方法創(chuàng)建的subject
_signal = subject;
return self;
}
signal調(diào)用publish 方法創(chuàng)建了一個(gè)RACSubject對(duì)象,然后將signal和新建的subject作為參數(shù)創(chuàng)建了RACMulticastConnection對(duì)象,connection對(duì)象的兩個(gè)成員變量_sourceSignal和_signal分別接收之前創(chuàng)建的signal和subject對(duì)象。
所以[connection.signal subscribeNext:]本質(zhì)上是調(diào)用RACSubject的subscribeNext:方法將訂閱者添加到屬性subscribers中。
最后查看connect方法的實(shí)現(xiàn):
- (RACDisposable *)connect {
BOOL shouldConnect = OSAtomicCompareAndSwap32Barrier(0, 1, &_hasConnected);
if (shouldConnect) {
self.serialDisposable.disposable = [self.sourceSignal subscribe:_signal];
}
return self.serialDisposable;
}
connect方法實(shí)現(xiàn)就是調(diào)用最初創(chuàng)建的signal的subscribe:方法,而參數(shù)subscriber則是publish方法中創(chuàng)建的subject。所以調(diào)用connect方法會(huì)觸發(fā)signal的block,subscriber會(huì)發(fā)生消息,因?yàn)閟ubscriber是subject對(duì)象,所以會(huì)遍歷subscribers給每個(gè)訂閱者發(fā)送消息,所以只打印了一次'-----'。