看rac的文檔介紹說的是,對于指定信號的一次訂閱share給其他的訂閱者播掷。簡單點就是一次訂閱多次使用季二,錯過了就錯過了。先說下冷信號和熱信號:
RACSignal *coldSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[[RACScheduler mainThreadScheduler] afterDelay:1.0f schedule:^{
[subscriber sendNext:@"1"];
}];
[[RACScheduler mainThreadScheduler] afterDelay:2.0f schedule:^{
[subscriber sendNext:@"2"];
}];
return nil;
}];
[coldSignal subscribeNext:^(id x) {
NSLog(@"訂閱者1冷信號%@", x);
}];
[coldSignal subscribeNext:^(id x) {
NSLog(@"訂閱者2冷信號%@", x);
}];
2016-02-01 10:56:22.271 demo[1897:64769] 訂閱者1冷信號1
2016-02-01 10:56:22.320 demo[1897:64769] 訂閱者2冷信號1
2016-02-01 10:56:23.447 demo[1897:64769] 訂閱者1冷信號2
2016-02-01 10:56:23.448 demo[1897:64769] 訂閱者2冷信號2
可見每次訂閱都會走didSubscribe這個block舀寓,下面將冷信號轉(zhuǎn)化為熱信號
RACSignal *coldSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[[RACScheduler mainThreadScheduler] afterDelay:1.0f schedule:^{
[subscriber sendNext:@"1"];
}];
[[RACScheduler mainThreadScheduler] afterDelay:2.0f schedule:^{
[subscriber sendNext:@"2"];
}];
return nil;
}];
RACSubject *hotSignal = [RACSubject subject];
[coldSignal subscribe:hotSignal];
[[RACScheduler mainThreadScheduler] afterDelay:0.5f schedule:^{
[hotSignal subscribeNext:^(id x) {
NSLog(@"訂閱者1熱信號%@", x);
}];
}];
[[RACScheduler mainThreadScheduler] afterDelay:1.5f schedule:^{
[hotSignal subscribeNext:^(id x) {
NSLog(@"訂閱者2熱信號%@", x);
}];
}];
2016-02-01 11:26:34.091 demo[2116:76297] 訂閱者1熱信號1
2016-02-01 11:26:35.175 demo[2116:76297] 訂閱者1熱信號2
2016-02-01 11:26:35.176 demo[2116:76297] 訂閱者2熱信號2
可見didSubscribe這個block只走了一次,后面的訂閱者錯過前面的send next肌蜻,就不會重新發(fā)送互墓。
下面開始看RACMulticastConnection的源碼:
//初始化操作
- (id)initWithSourceSignal:(RACSignal *)source subject:(RACSubject *)subject {
NSCParameterAssert(source != nil);
NSCParameterAssert(subject != nil);
self = [super init];
if (self == nil) return nil;
_sourceSignal = source;
_serialDisposable = [[RACSerialDisposable alloc] init];
_signal = subject;
return self;
}
#pragma mark Connecting
- (RACDisposable *)connect {
BOOL shouldConnect = OSAtomicCompareAndSwap32Barrier(0, 1, &_hasConnected);
if (shouldConnect) {
//可見到核心的代碼也就是上面試驗的
self.serialDisposable.disposable = [self.sourceSignal subscribe:_signal];
}
return self.serialDisposable;
}
- (RACSignal *)autoconnect {
__block volatile int32_t subscriberCount = 0;
return [[RACSignal
createSignal:^(id<RACSubscriber> subscriber) {
OSAtomicIncrement32Barrier(&subscriberCount);
RACDisposable *subscriptionDisposable = [self.signal subscribe:subscriber];
RACDisposable *connectionDisposable = [self connect];
return [RACDisposable disposableWithBlock:^{
[subscriptionDisposable dispose];
if (OSAtomicDecrement32Barrier(&subscriberCount) == 0) {
[connectionDisposable dispose];
}
}];
}]
setNameWithFormat:@"[%@] -autoconnect", self.signal.name];
}