8

我正在尝试学习 ReactiveCocoa,并且正在编写一个简单的 Space Invaders 克隆,基于 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,但此时我想知道我是否处于正确的反应轨道。

4

3 回答 3

12

而不是+combineLatest:reduce:,你想要+zip:reduce:。Zip 要求在减少和发送新值之前更改所有信号。

于 2013-11-22T13:35:19.240 回答
5

由于您实际上并不关心计时器的值,因此-sample:可以做您想做的事情:

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

这将转发每次触发时的最新值。gestureSignalupdateEventSignal

于 2013-11-22T20:03:33.583 回答
1
   [[[[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.
        }];
于 2014-03-30T08:41:18.897 回答