RACSignal創(chuàng)建流程
//1、創(chuàng)建信號(hào)
RACSignal * signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
//3、發(fā)送信號(hào)
[subscriber sendNext:@"LGCooci"];
return nil;
}];
//2、訂閱信號(hào)
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"訂閱到了%@",x);
}];
- 創(chuàng)建信號(hào) -
createSignal() - 訂閱信號(hào) -
subscribeNext() - 發(fā)送信號(hào) -
sendNext()sendCompleted()sendError()
核心邏輯源碼分析
創(chuàng)建信號(hào)
+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
return [RACDynamicSignal createSignal:didSubscribe];
}
+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
RACDynamicSignal *signal = [[self alloc] init];
signal->_didSubscribe = [didSubscribe copy];
return [signal setNameWithFormat:@"+createSignal:"];
}
createSignal帶入一個(gè)block:didSubscribeRACDynamicSignal創(chuàng)建信號(hào),并保存block:_didSubscribe
訂閱信號(hào)
- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock {
NSCParameterAssert(nextBlock != NULL);
RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:NULL completed:NULL];
return [self subscribe:o];
}
+ (instancetype)subscriberWithNext:(void (^)(id x))next error:(void (^)(NSError *error))error completed:(void (^)(void))completed {
RACSubscriber *subscriber = [[self alloc] init];
subscriber->_next = [next copy];
subscriber->_error = [error copy];
subscriber->_completed = [completed copy];
return subscriber;
}
RACSubscriber創(chuàng)建訂閱者o, 傳入block:nextBlockRACSubscriber內(nèi)部保存blcok:nextBlock的_next,_error,_completed- 調(diào)用
[self subscribe:o],此時(shí)的self即為:RACDynamicSignal對(duì)象
進(jìn)入RACDynamicSignal的subscribe內(nèi)部:
- (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber {
NSCParameterAssert(subscriber != nil);
RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable];
subscriber = [[RACPassthroughSubscriber alloc] initWithSubscriber:subscriber signal:self disposable:disposable];
if (self.didSubscribe != NULL) {
RACDisposable *schedulingDisposable = [RACScheduler.subscriptionScheduler schedule:^{
RACDisposable *innerDisposable = self.didSubscribe(subscriber);
[disposable addDisposable:innerDisposable];
}];
[disposable addDisposable:schedulingDisposable];
}
return disposable;
}
RACPassthroughSubscriber(接受了RACSubscriber協(xié)議)傳入subscriber重新初始化了新的subscriber- 調(diào)用
self.didSubscribe(subscriber), 這里的didSubscribe即為創(chuàng)建信號(hào)時(shí)候保存的block, 這里就直接就把subscriber回調(diào)了回去
發(fā)送信號(hào)
//3、發(fā)布信號(hào)
[subscriber sendNext:@"LGCooci"];
[subscriber sendCompleted];
- (void)sendNext:(id)value {
@synchronized (self) {
void (^nextBlock)(id) = [self.next copy];
if (nextBlock == nil) return;
nextBlock(value);
}
}
- (void)sendError:(NSError *)e {
@synchronized (self) {
void (^errorBlock)(NSError *) = [self.error copy];
[self.disposable dispose];
if (errorBlock == nil) return;
errorBlock(e);
}
}
- (void)sendCompleted {
@synchronized (self) {
void (^completedBlock)(void) = [self.completed copy];
[self.disposable dispose];
if (completedBlock == nil) return;
completedBlock();
}
}
- 這里的
subscriber即為訂閱信號(hào)調(diào)用didSubscribe回調(diào)傳出來的RACPassthroughSubscriber對(duì)象, 當(dāng)調(diào)用sendNext,sendError,sendCompleted的時(shí)候,就會(huì)通過保存的.next, .error, .completedblock進(jìn)行回調(diào),最后就完成了整個(gè)流程