首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多个RACSignal的combineLatest

使用多个RACSignal的combineLatest
EN

Stack Overflow用户
提问于 2013-03-08 16:07:26
回答 1查看 2.9K关注 0票数 3

我正在试验反应性可可,我很难组合来自多个UIControls的信号。

我正在为UIEdgeInsets创建一个编辑器,它有四个UISteppers,用于顶部、左侧、底部和右侧。

我想做的是:

代码语言:javascript
复制
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)];
          }];

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

如果我只包括一个信号,像这样:

代码语言:javascript
复制
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项目提出一个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-08 16:35:54

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

代码语言:javascript
复制
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)];
                    }];
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15298260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档