0

rac_signalForControlEventUIButtonの on を、次のようないくつかの結合された textFields シグナルと結合したい:

    [[[[self.loginButton rac_signalForControlEvents:UIControlEventTouchUpInside]
    combineLatestWith:textFieldsCombinedSignal]
    filter:^BOOL(RACTuple *signals) {
      return ((UIButton *)[signals first]).highlighted;
    }]  subscribeNext:^(RACTuple *signals) {
      if ([signals.second boolValue])
      {
          [self doLogin];
      }
      else
      {
          [self error];
      }
    }];

しかし、この方法では、ボタンが強調表示された状態をフィルタリングする必要があります。そうしないsubscribeNext:と、テキストフィールドの一部が変更されるたびにブロックが起動されます( textFieldsCombinedSignal)。

強調表示されたボタンの状態をフィルター処理することなく、これを達成したいと思っています (結局、状態を最小化するために ReactiveCocoa を使用していますが、これが私がやろうとしていることを行う適切な方法だとは思いません)。

4

2 に答える 2

1

一連のボタン タップと結合されたテキスト フィールド シグナルからの最新のタップが必要な場合は、のように簡単に使用できます-flattenMap:

[[[self.loginButton
    rac_signalForControlEvents:UIControlEventTouchUpInside]
    flattenMap:^(id _) {
        return [textFieldsCombinedSignal take:1];
    }]
    subscribeNext:^…];

ただし、あなたが説明したことから、これは の典型的なケースのようですRACCommand。このコードと元のコードの両方で、ユーザーはログイン ボタンをダブルタップして同時ログインをトリガーできます。

を示す前にRACCommand、コードについていくつかの仮定を立てます。名前だけからするtextFieldsCombinedSignalと、文字列のタプルを送信するシグナルである可能性がありますが、実際には YES/NO を送信する検証シグナルのように見えます。後者を想定し、名前を に変更しloginIsValidます。-doLoginまた、この例では同期していると仮定します。

今にRACCommand

self.loginButton.rac_command = [[RACCommand alloc] initWithEnabledSignal:loginIsValid signalBlock:^(id _) {
    return [RACSignal defer:^{
        [self doLogin];
        return [RACSignal empty];
    }];
}];

で送信された最新の値に基づいて、ログイン ボタンを有効/無効にしますloginIsValid。有効にすると、ボタンをタップする-doLoginと呼び出され、ログイン プロセスの間はボタンが無効になり、同時ログインが防止されます。

于 2013-12-19T06:01:03.177 に答える
1

textFieldsCombinedSignalボタンがタップされるたびにサンプリングしたいだけのように聞こえます。使ってみてください-sample::

RACSignal *buttonSignal = [self.loginButton rac_signalForControlEvents:UIControlEventTouchUpInside];
[[textFieldsCombinedSignal sample:buttonSignal] subscribeNext:^(RACTuple *combinedTextFields) {
    // do stuff with combinedTextFields
}];
于 2013-12-19T01:15:50.807 に答える