我想,我找到了解决办法。诀窍是将取消信号合并到刻度信号中,然后取X个样本。最后的订户将在每次打勾信号时收到下一个事件,并且当'take'完成时完成。取消可以通过在取消定时器上发送错误来实现。
__block RACSubject *cancelTimer = [RACSubject subject];
RACSubscribable *tickWithCancel = [[RACSubscribable interval:1.0] merge:cancelTimer];
RACSubscribable *timeoutFiveSec = [tickWithCancel take:5];
[timeoutFiveSec subscribeNext:^(id x) {
NSLog(@"Tick");
} error:^(NSError *error) {
NSLog(@"Cancelled");
} completed:^{
NSLog(@"Completed");
[alert dismissWithClickedButtonIndex:-1 animated:YES];
}];
要激活取消,必须执行以下操作。
[cancelTimer sendError:nil]; // nil or NSError
为什么不是普通的'NSTimer'?你可以' - 无效'它... – 2012-11-25 21:43:40
我想利用反应行为。我知道如何用NSTimer做这件事,但这是一个产生较少错误代码的实验。命令式编程难以处理大型状态空间的复杂性。这是响应式编程可以帮助的地方。 – allprog
在ReactiveCocoa的当前版本中,一旦获取了指定数量的值,'take'操作将自动终止'oneSecGenerator'信号。 – erikprice