8

私は ReactiveCocoa を学ぼうとしており、Ray Wenderlich のチュートリアルに基づいて、単純な Space Invaders のクローンを作成しています。最近、開発中に、解決できない問題に直面しました。基本的に私は2つのシグナルを持っています:

  • タップジェスチャー信号
  • 毎秒起動する時限シーケンス

私が達成したいのは、これらのシグナルを新しいシグナルに結合し、両方のシグナルが変化したときに発火することです:それは可能ですか? 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 に答える