2013-11-22 7 views
8

ReactiveCocoaを学習しようとしていて、Ray Wenderlichチュートリアルに基づいて単純なSpace Invadersクローンを作成しています。 最近、開発中に解決できない問題が発生しました。 は基本的に私は、2つの信号ました:ReactiveCocoaの信号を、すべての変更時に発生する新しい信号に結合します。

  • を私が達成したいどのようなタップジェスチャー信号
  • 毎秒

を発射タイミングシーケンスは、新しいものではこれらの信号を組み合わせることであること両方の信号が変化すると起動します: 可能ですか? 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ではありませんが、私は右にいる場合は、この時点で、私は疑問に思いますリアクティブトラックかどうか。

答えて

12

+combineLatest:reduce:の代わりに、+zip:reduce:が必要です。 Zipでは、新しい値を減らして送信する前に、すべての信号が変更される必要があります。あなたが実際にタイマーの値を気にしないので

+0

Clever。 私はドキュメントでzipを見つけられませんでした。ヘッダーファイルを一見するだけで、そのプロパティに気付かなかったのです。 –

5

-sample:は、あなたがやりたいことがあります。

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

このgestureSignalたびupdateEventSignal火災から最新値を転送します。

+0

これは完璧なはずですが、1回タップした後は、毎秒同じ値をサンプリングし続けます。 元の信号をリセットする方法はありますか? –

+0

ああ、いいえ、演算子は実際にそのためのものではありません。 '+ zip:'のほうがいい選択肢です。 –

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. 
     }]; 
関連する問題