反应性可可条件延迟

时间:2015-01-11 19:34:19

标签: ios objective-c functional-programming reactive-programming reactive-cocoa

我正试图围绕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中是否可行,如果是这样,它是如何完成的?

1 个答案:

答案 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秒然后暂停。当我们取消暂停时,我们立即通过

发送价值