RAC switchToLatest
2018-04-24 本文已影响16人
哦呵呵y
Vertical Cross Functional Template (2).png系列文章
RACSignal,RACSubject,RACReplaySubject
RAC bind
RAC Merge flatten
RACMulticastConnection
RAC switchToLatest
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"];
- 原信号通过switchToLatest,获取信号中最新的信号来进行订阅
- switchToLatest 内部通过 connect、bind来进行二次转发。
- 原信号发送信号消息的时候,会进触发connect.signal信号,而且bind已经hook了connect.signal,所以信号会进入bind内部,调用过滤方法。
- 外部传进来的信号通过
[x takeUntil:[connection.signal concat:[RACSignal never]]]
创建一个新的信号,并进行注册。而且这个方法内部订阅了connection.signal
方法。 - 当发送新的信号消息时,会一同触发,
[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
能获取的最新的信号了。