我正在尝试学习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,但此时我想知道我是否在正确的被动轨道中。
答案 0 :(得分:12)
而不是+combineLatest:reduce:
,您需要+zip:reduce:
。 Zip要求在减少和发送新值之前更改所有信号。
答案 1 :(得分:5)
由于您实际上并不关心计时器的值,-sample:
可能会做您想做的事情:
[[gestureSignal
sample:updateEventSignal]
subscribeNext:^(id tap) {
NSLog(@"Tapped [%@]", tap);
}];
每当gestureSignal
触发时,这将从updateEventSignal
转发最新值。
答案 2 :(得分: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.
}];