4

私は反応性ココアにかなり慣れていないので、私が構築しようとしているゲームに FRP の要素を含めようとしています。オンラインで検索したところ、Reactive cocoa のリソースとドキュメントは非常に限られており、ほとんどのチュートリアルで同じ例が使用されています。

私がやりたいことは、ビューの現在のタッチの値のストリームを提供する RACSignal を持つことです (簡単にするためにマルチタッチはないと仮定します)。そして、subscribeNext を使用して、UITouch オブジェクトが変更されたときにアクションを実行します。RAC 信号自体の設定に問題があります。

現在、次のことを行っています(これが正しい方法かどうかはわかりません!)

  @interface MyView:UIView{

      UITouch *currentTouch;
      RACSignal *touchSignal;
  }
  @property(nonatomic , assign)UITouch *currentTouch;



  @implementation MyView
  @synthesize currentTouch;

  -(id)init{
     if(self = [super init]){

    }
    return self;
  }

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

   NSArray *touchArray = [touches allObjects]; 
   for(UITouch *touch in toucheArray){   
       currentTouch = touch;  
       if(!touchSignal){
           touchSignal = [RACObserve(self , currentTouch) distinctUntilChanged];
       }

    }

}

しかし、RACSignal がゲームのクラッシュを初期化しようとするたびに、次のメッセージが表示されます。

 [MyView rac_valuesForKeyPath:observer:]: unrecognized selector sent to instance 0x2084cf90

私は何を間違っていますか?RACSignal をセットアップする正しい方法は何ですか? また、別のオブジェクト (おそらく MyView モデル) で touchSignal を使用し、サブスクライブを使用してブロック内の操作を実行するにはどうすればよいですか?

4

1 に答える 1

2

を使用して、これを行う方法です-rac_signalForSelector:。これはより宣言的であり、命令的ではありません (これがバグの原因だと思います)。

RACSignal *touchSignal = [[[self
    rac_signalForSelector:@selector(touchesBegan:withEvent:)]
    reduceEach:^(NSSet *touches, UIEvent *event) {
        return [touches anyObject];
    }]
    distinctUntilChanged]
于 2013-10-21T16:29:56.747 に答える