RAC switchToLatest

系列文章
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 能获取的最新的信号了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • RAC使用测试Demo下载:github.com/FuWees/WPRACTestDemo 1.ReactiveC...
    FuWees阅读 11,541评论 3 10
  • 前言 之前对RAC有了一个基本的认识,了解了它的作用,以及RAC的运行机制,我们知道只要是信号(RACSignal...
    大大盆子阅读 9,934评论 0 11
  • RACSignal: 一:创建方法: + (RACSignal *)createSignal:(RACDispos...
    飞翔的青蛙王子阅读 4,505评论 0 2
  • 我一直觉得,RAC是仿佛已经被遗忘的话题,擅长的人已经把它化为内力,不擅长的早已忘记这个技术的存在,这个暂且按住不...
    daixunry阅读 10,031评论 0 11
  • 1.ReactiveCocoa常见操作方法介绍。 1.1 ReactiveCocoa操作须知 所有的信号(RACS...
    萌芽的冬天阅读 4,652评论 0 5