反应性 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 秒然后暂停。当我们取消暂停时,我们立即通过
发送值
我正在努力研究 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 秒然后暂停。当我们取消暂停时,我们立即通过
发送值