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 回答