将ReactiveCocoa中的信号合并成一个新的,当所有的改变都会触发

我正在学习ReactiveCocoa,并且正在写一个基于Ray Wenderlich教程的简单太空侵略者克隆。 最近在开发过程中,我遇到了一个我无法解决的问题。 基本上我有两个信号:

  • 轻击手势信号
  • 一个每秒钟都在发射的定时序列

我想要实现的是将这些信号合并成一个新的信号,当两个信号都发生变化时就会触发这个信号吗? 我看到了combineLatest方法,但只要有任何信号发生变化,块就会执行。

我想要的伪代码是:

RACSignal *updateEventSignal = [RACSignal interval:1 onScheduler:[RACScheduler mainThreadScheduler]]; RACSignal *gestureSignal = [[UITapGestureRecognizer new] rac_gestureSignal]; [[RACSignal combineBoth:@[gestureSignal, updateEventSignal] reduce:^id(id tap, id counter){ return tap; }] subscribeNext:^(id x) { NSLog(@"Tapped [%@]", x); }]; 

也许我可以通过其他方式获得相同的结果,或者这不是预期的行为或ReactiveCocoa,但在这一点上,我想知道我是否处于正确的反应轨道。

+combineLatest:reduce: ,你想+zip:reduce: 。 邮编要求所有信号在减less和发送一个新的价值之前改变。

既然你实际上并不关心定时器的值, -sample:可以做你想做的事情:

 [[gestureSignal sample:updateEventSignal] subscribeNext:^(id tap) { NSLog(@"Tapped [%@]", tap); }]; 

每当updateEventSignal触发时,这将转发来自gestureSignal最新值。

  [[[[RACSignal zip:@[RACObserve(self, minimum), RACObserve(self, maximum), RACObserve(self, average)]] skip:1] reduceEach:^id{ return nil; }] subscribeNext:^(id x) { [self buildView]; //called once, while all three values were changed. }];