看rac的文檔介紹說(shuō)的是,對(duì)于指定信號(hào)的一次訂閱share給其他的訂閱者。簡(jiǎn)單點(diǎn)就是一次訂閱多次使用,錯(cuò)過(guò)了就錯(cuò)過(guò)了。先說(shuō)下冷信號(hào)和熱信號(hào):
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冷信號(hào)%@", x);
}];
[coldSignal subscribeNext:^(id x) {
NSLog(@"訂閱者2冷信號(hào)%@", x);
}];
2016-02-01 10:56:22.271 demo[1897:64769] 訂閱者1冷信號(hào)1
2016-02-01 10:56:22.320 demo[1897:64769] 訂閱者2冷信號(hào)1
2016-02-01 10:56:23.447 demo[1897:64769] 訂閱者1冷信號(hào)2
2016-02-01 10:56:23.448 demo[1897:64769] 訂閱者2冷信號(hào)2
可見(jiàn)每次訂閱都會(huì)走didSubscribe這個(gè)block,下面將冷信號(hào)轉(zhuǎn)化為熱信號(hào)
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熱信號(hào)%@", x);
}];
}];
[[RACScheduler mainThreadScheduler] afterDelay:1.5f schedule:^{
[hotSignal subscribeNext:^(id x) {
NSLog(@"訂閱者2熱信號(hào)%@", x);
}];
}];
2016-02-01 11:26:34.091 demo[2116:76297] 訂閱者1熱信號(hào)1
2016-02-01 11:26:35.175 demo[2116:76297] 訂閱者1熱信號(hào)2
2016-02-01 11:26:35.176 demo[2116:76297] 訂閱者2熱信號(hào)2
可見(jiàn)didSubscribe這個(gè)block只走了一次,后面的訂閱者錯(cuò)過(guò)前面的send next,就不會(huì)重新發(fā)送。
下面開(kāi)始看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) {
//可見(jiàn)到核心的代碼也就是上面試驗(yàn)的
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];
}