我正试图围绕ReactiveCocoa框架,但我一直试图弄清楚如何有条件地延迟。
例如,我想在数组为空时将CADisplayLink暂停属性设置为false。以下是我完成这项工作的方法:
RACSignal *changeSignal = [self rac_valuesAndChangesForKeyPath:@keypath(self, projectiles) options:NSKeyValueObservingOptionNew observer:nil];
RAC(self.displayLink, paused) = [changeSignal map:^id(RACTuple *value) {
return @([((NSMutableArray *)value.first) count] == 0);
}];
但是在暂停显示链接之前,我想保持动画几秒钟,所以我在地图块的末尾添加了delay:2.5];
。
现在我遇到的问题是等待2.5秒停止并启动显示链接。我只想在我将self.displayLink.paused
设置为YES
时暂停RAC,而不是在我将其设置为NO
时暂停。
这种类型的“条件延迟”在ReactiveCocoa中是否可行,如果是这样,它是如何完成的?
答案 0 :(得分:1)
我在GitHub page for ReactiveCocoa得到了一些帮助:
你可以使用-flattenMap:这样做,因为它可以让你返回一个信号,而不只是一个值:
RAC(self.displayLink, paused) = [changeSignal flattenMap:^id(RACTuple *value) {
RACSignal *pauseSignal = [RACSignal return:@([((NSMutableArray *)value.first) count] == 0)];
if (pause) {
return [pauseSignal delay:2.5];
} else {
return pauseSignal;
}
}];
因此,当我们暂停时,我们会延迟2.5秒然后暂停。当我们取消暂停时,我们立即通过
发送价值