源码解析RAC+RxSwift

RAC switchToLatest

2018-04-24  本文已影响16人  哦呵呵y

系列文章
RACSignal,RACSubject,RACReplaySubject
RAC bind
RAC Merge flatten
RACMulticastConnection
RAC switchToLatest

Vertical Cross Functional Template (2).png

switchToLatest:用于信号中信号,通过switchToLatest获取最新的信号

    RACSubject *signalOfSignals = [RACSubject subject];
    RACSubject *signalA = [RACSubject subject];
    RACSubject *signalB = [RACSubject subject];
    // 获取信号中信号最近发出信号,订阅最近发出的信号。
    // 注意switchToLatest:只能用于信号中的信号
    [signalOfSignals.switchToLatest subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
    [signalOfSignals sendNext:signalA];
    [signalOfSignals sendNext:signalB];
    [signalA sendNext:@"signalA"];
    [signalB sendNext:@"signalB"];
  1. 原信号通过switchToLatest,获取信号中最新的信号来进行订阅
  2. switchToLatest 内部通过 connect、bind来进行二次转发。
  3. 原信号发送信号消息的时候,会进触发connect.signal信号,而且bind已经hook了connect.signal,所以信号会进入bind内部,调用过滤方法。
  4. 外部传进来的信号通过[x takeUntil:[connection.signal concat:[RACSignal never]]]创建一个新的信号,并进行注册。而且这个方法内部订阅了connection.signal方法。
  5. 当发送新的信号消息时,会一同触发,[x takeUntil:[connection.signal concat:[RACSignal never]]]信号内部
        void (^triggerCompletion)(void) = ^{
            [disposable dispose];
            [subscriber sendCompleted];
        };

        RACDisposable *triggerDisposable = [signalTrigger subscribeNext:^(id _) {
            triggerCompletion();
        } completed:^{
            triggerCompletion();
        }];

其中subscriber就是在bind内部对过滤后的信号的订阅者,也就是说当传入一个新的消息时,会把上一个创建的消息给移除。所以就保证了 switchToLatest 能获取的最新的信号了。

上一篇下一篇

猜你喜欢

热点阅读