//@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];
答案 0 :(得分:1)
-combineLatest:
从阵列中的每个信号累积一个“下一个”项,直到所有信号都发送了一个。此时,它最终发送一个RACTuple
,其中包含数组中每个信号的“下一个”值。
您的RACObserve
信号在初始设置时分别发送一个“下一个”。当物业发生变化时,他们将来会再次发送“下一个”。
UISwitch
根据控件事件按预期发送“下一个”。但由于RACObserve
信号可能已停止发送“下一个”,因此它们会使UISwitch
挂起而-combineLatest:
无法发送超过第一个“下一个”。所以你的-reduceEach:
只会在第一次开火。
编辑:实际上,请继续 - 我只是重读了-combineLatest:
的文档,它说一旦提供了第一套完整的“下一个”(对于每个信号),任何额外的“下一个”来自任何信号都应该使组合信号通过RACTuple
来传递每个信号的最新值。所以我不确定发生了什么,抱歉没有答案!