【问题标题】:ReactiveCocoa and UISwitchReactiveCocoa 和 UISwitch
【发布时间】:2014-02-03 08:58:53
【问题描述】:
//@property (weak, nonatomic) IBOutlet UIImageView *imageView;
//@property (nonatomic) UIImage *image;
//@property (nonatomic) PhotoEffect *effect;
//@property (weak, nonatomic) IBOutlet UISwitch *glossSwitch;

目前,由于UISwitch 不适用于KVO,我遇到了一个问题。以下代码仅在 switch 从其初始状态更改时触发:

RAC(self.imageView, image) = [[[[RACSignal

                                combineLatest:@[ RACObserve(self, image), [self.glossSwitch
                                                                                   rac_signalForControlEvents:UIControlEventValueChanged], RACObserve(self, effect)]]
                              deliverOn:[RACScheduler scheduler]]
                              reduceEach:^UIImage *(UIImage *im, UISwitch *glossSwitch, PhotoEffect *effect) {
                                  if (!im) {
                                      return nil;
                                  }
                                  if (effect) {
                                      im = [im imageWithEffect:effect.type];
                                  }

                                  if (glossSwitch.on) {
                                      im = [GlossyIcon applyShineToImage:im];
                                  }
                                  return im;
                              }]
                              deliverOn:RACScheduler.mainThreadScheduler];

【问题讨论】:

  • 对我的(已删除)回答感到抱歉。我的阅读理解能力很差。
  • @JustinSpahr-Summers 没问题 :) 我们都会不时这样做。

标签: objective-c ios7 uiswitch reactive-cocoa


【解决方案1】:

-combineLatest: 从数组中的每个信号中累积一个“下一个”项目,直到所有信号都发送了一个。此时,它最终会发送一个RACTuple,其中包含数组中每个信号的“下一个”值。

您的RACObserve 信号会在初始设置时分别发送一个“下一个”。以后当属性发生变化时,他们会再次发送“next”。

UISwitch 正在根据控制事件按预期发送“下一个”。但是由于RACObserve 信号可能已经停止发送“下一个”,它们会让您的UISwitch 挂起,-combineLatest: 不能发送比第一个“下一个”更多的信号。所以你的-reduceEach: 只会在第一次触发。

编辑:实际上,等等——我只是重新阅读了-combineLatest: 的文档,它说一旦提供了第一组完整的“下一个”(对于每个信号),任何信号的任何额外“下一个”应该导致组合信号传递一个RACTuple,其中包含每个信号的最新值。所以我不确定发生了什么,抱歉没有回答!

【讨论】:

  • 谢谢,我知道了。我声明了布尔值,每次 UISwitch 更改时都使用切换方法更改它,并开始使用 RACObserve 观察它。当布尔属性发生变化时,RACObserve 不会发送信号。我检查了 KVO(添加的观察者)并且它有效。你知道 RACObserve 有什么问题吗?
  • 更改属性时,请确保通过RACObserve 中指定的对象更改它,而不是例如使用“_” ivar 访问 self。应该工作。
猜你喜欢
  • 2014-05-31
  • 1970-01-01
  • 2015-12-23
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多