我正在试验 Reactive Cocoa,但在组合来自多个 UIControl 的信号时遇到了问题。

我正在为 UIEdgeInsets 创建一个编辑器,并且有四个 UISteppers,分别用于顶部、左侧、底部和右侧的插入。

我想做的是这样的:

RAC(self.insets) = [RACSignal combineLatest:@[
          [topStepper rac_signalForControlEvents:UIControlEventValueChanged],
          [leftStepper rac_signalForControlEvents:UIControlEventValueChanged],
          [bottomStepper rac_signalForControlEvents:UIControlEventValueChanged],
          [rightStepper rac_signalForControlEvents:UIControlEventValueChanged]
          ] reduce:^(UIStepper *top, UIStepper *left, UIStepper *bottom, UIStepper *right) {
              return [NSValue valueWithUIEdgeInsets:UIEdgeInsetsMake(top.value, left.value, bottom.value, right.value)];
          }];

然而,这永远不会导致信号被处理。

如果我只包含一个信号,像这样:
RAC(self.insets) = [RACSignal combineLatest:@[
    [topStepper rac_signalForControlEvents:UIControlEventValueChanged]]
    reduce:^(UIStepper *top) {
        return [NSValue valueWithUIEdgeInsets:UIEdgeInsetsMake(top.value, 0.0,0.0,0.0)];
    }];

它按预期工作(观察任何其他步进器单独工作也很好)但对于多个控件,我什么也得不到。我可以通过将每个控件作为单独的信号进行观察来解决,但这似乎错过了 combineLatest 方法的重点。我是不是做错了什么,还是应该就 RAC 项目提出问题?

最佳答案

这是因为为了让 combineLatest:reduce: 运行,该数组中的每个控件都必须至少广播一个信号以开始(观察最新的信号的任何非变异值都不会调用reduce块)。您可以很清楚地看到它,因为每个控件都必须至少被点击一次才能开始产生有效信号,这些信号会像您期望的那样被投入和处理。 .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .正如贾斯汀所指出的,您可以使信号具有初始值,这应该比调用 -sendActionForControlEvent: 更快地获得正确的值并运行

RAC(self.insets) = [RACSignal combineLatest:@[
                    [[self.topStepper rac_signalForControlEvents:UIControlEventValueChanged]startWith:nil],
                    [[self.leftStepper rac_signalForControlEvents:UIControlEventValueChanged]startWith:nil],
                    [[self.bottomStepper rac_signalForControlEvents:UIControlEventValueChanged]startWith:nil],
                    [[self.rightStepper rac_signalForControlEvents:UIControlEventValueChanged]startWith:nil]
                    ] reduce:^(UIStepper *top, UIStepper *left, UIStepper *bottom, UIStepper *right) {
                        return [NSValue valueWithUIEdgeInsets:UIEdgeInsetsMake(top.value, left.value, bottom.value, right.value)];
                    }];

关于ios - RACSignal combineLatest 使用多个 UIControls,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15298260/

10-10 19:13