ReactiveCocoa和UISwitch

时间:2014-02-03 08:58:53

标签: objective-c ios7 uiswitch reactive-cocoa

//@property (weak, nonatomic) IBOutlet UIImageView *imageView;
//@property (nonatomic) UIImage *image;
//@property (nonatomic) PhotoEffect *effect;
//@property (weak, nonatomic) IBOutlet UISwitch *glossSwitch;

目前,由于UISwitchKVO不兼容,我遇到了问题。只有当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];

1 个答案:

答案 0 :(得分:1)

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

您的RACObserve信号在初始设置时分别发送一个“下一个”。当物业发生变化时,他们将来会再次发送“下一个”。

UISwitch根据控件事件按预期发送“下一个”。但由于RACObserve信号可能已停止发送“下一个”,因此它们会使UISwitch挂起而-combineLatest:无法发送超过第一个“下一个”。所以你的-reduceEach:只会在第一次开火。

编辑:实际上,请继续 - 我只是重读了-combineLatest:的文档,它说一旦提供了第一套完整的“下一个”(对于每个信号),任何额外的“下一个”来自任何信号都应该使组合信号通过RACTuple来传递每个信号的最新值。所以我不确定发生了什么,抱歉没有答案!