RAC框架源码解析之RACReplaySubject

1、RACReplaySubject

前面的文章我们说到RACSubject既可以 创建信号 又可以 订阅信号 还可以 发送信号,下面我们来看看RACReplaySubject是用来干什么的。

只要用到RAC绝对逃不过三部曲:
1、创建信号
2、订阅信号
3、发送信号

    //1.创建信号
    RACReplaySubject *subject = [RACReplaySubject subject];
    
    //2.订阅信号
    [subject subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@", x);
    }];
    
    //3.发送信号
    [subject sendNext:@"我在发送信号"];

我们看到 RACReplaySubject 的用法和 RACSubject 差不多,外层代码看起来一样,但是其内部实现原理还是有些许的差别,首先我们知道 RACReplaySubject 是继承于 RACSubject 的,所以说创建信号的原理是一样的,接下来我们看一下订阅信号两者有何不同

[subject subscribeNext:^(id _Nullable x) { NSLog(@"%@", x); }]; 这两者有何不同? 我们点击subscribeNext这个方法中查看一下,如下代码,方法是一样,那有何不同?不同在于一个[self subscribe:0]这行代码,我们知道子类调用这个方法的时候肯定会覆盖父类的方法,所以我们看看子类的实现方法和父类的实现方法有何不同?

- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock {
    NSCParameterAssert(nextBlock != NULL);
    
    RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:NULL completed:NULL];
    return [self subscribe:o];
}

有一点很不一样的就是在初始化的时候subject方法会创建一个数组,而在subscriber这个方法中他遍历了数组(也就是订阅者),而且只要数据中有值就直接发送数据,那么作者为什么要这么做呢!那是因为有一种情况就是使用者在创建信号的时候需要发送信号,而RACReplaySubject帮你把发送信号保存在了一个数组里面,当你订阅的时候马上就能收到消息。

--------------------- subscribe 方法 ---------------------- 
- (RACDisposable *)subscribe:(id)subscriber {
    RACCompoundDisposable *compoundDisposable = [RACCompoundDisposable compoundDisposable];

    RACDisposable *schedulingDisposable = [RACScheduler.subscriptionScheduler schedule:^{
        @synchronized (self) {
            for (id value in self.valuesReceived) {
                if (compoundDisposable.disposed) return;

                [subscriber sendNext:(value == RACTupleNil.tupleNil ? nil : value)];
            }

            if (compoundDisposable.disposed) return;

            if (self.hasCompleted) {
                [subscriber sendCompleted];
            } else if (self.hasError) {
                [subscriber sendError:self.error];
            } else {
                RACDisposable *subscriptionDisposable = [super subscribe:subscriber];
                [compoundDisposable addDisposable:subscriptionDisposable];
            }
        }
    }];

    [compoundDisposable addDisposable:schedulingDisposable];

    return compoundDisposable;
}

demo源代码已放置GitHub地址https://github.com/JunAILiang/RAC_Demo

联系我:
qq: 1245424073
微信: liujunmin6980

你可能感兴趣的:(RAC框架源码解析之RACReplaySubject)