反应性 Cocoa 条件延迟

Reactive Cocoa Conditional Delay

我正在努力研究 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);
}];

但在我暂停显示之前 link,我想保持动画几秒钟,所以我在地图块的末尾添加了一个 delay:2.5];

现在我 运行 遇到了等待 2.5 秒停止和启动显示的问题 link。我只希望 RAC 在将 self.displayLink.paused 设置为 YES 时暂停,而不是在将其设置为 NO.

时暂停

这种类型的"conditional delay"在ReactiveCocoa中是否可行,如果可行,它是如何实现的?

我在 GitHub page for ReactiveCocoa 得到了一些帮助:

您可以使用 -flattenMap: 来执行此操作,因为它可以让您 return 一个信号而不仅仅是一个值:

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

发送值