01.RACSignal

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:"];
}
  1. createSignal 帶入一個(gè)block:didSubscribe
  2. RACDynamicSignal創(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;
}
  1. RACSubscriber創(chuàng)建訂閱者o, 傳入block:nextBlock
  2. RACSubscriber內(nèi)部保存blcok:nextBlock_next,_error,_completed
  3. 調(diào)用[self subscribe:o],此時(shí)的self即為:RACDynamicSignal對(duì)象

進(jìn)入RACDynamicSignalsubscribe內(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;
}
  1. RACPassthroughSubscriber(接受了RACSubscriber協(xié)議)傳入subscriber重新初始化了新的subscriber
  2. 調(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();
    }
}
  1. 這里的subscriber即為訂閱信號(hào)調(diào)用didSubscribe回調(diào)傳出來的RACPassthroughSubscriber對(duì)象, 當(dāng)調(diào)用sendNext,sendError,sendCompleted的時(shí)候,就會(huì)通過保存的.next, .error, .completed block進(jìn)行回調(diào),最后就完成了整個(gè)流程
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容