【问题标题】:Reactive Cocoa Conditional Delay反应性可可条件延迟
【发布时间】:2015-01-11 19:34:18
【问题描述】:

我正在尝试围绕 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 秒才能停止并启动显示链接。我只希望 RAC 在将 self.displayLink.paused 设置为 YES 时暂停,而不是在我将其设置为 NO 时暂停。

这种类型的“条件延迟”在 ReactiveCocoa 中是否可以实现,如果可以,它是如何实现的?

【问题讨论】:

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


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

    发送值

    【讨论】:

      猜你喜欢
      • 2016-06-17
      • 2019-06-07
      • 1970-01-01
      • 2017-02-22
      • 2019-08-27
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 2014-12-17
      相关资源
      最近更新 更多