刚开始使用ReactiveCocoa并慢慢转换我当前的代码以使用它。
现在我已完成倒计时日期计时器,只是我不知道如何在倒计时结束时停止计时器并完成另一个操作。
NSTimeInterval dateInSecond = 1440855240;
self.dateUntilNextEvent = [NSDate dateWithTimeIntervalSince1970:dateInSecond];
RACSignal *countdownSignal = [[[[RACSignal interval:1 onScheduler:[RACScheduler schedulerWithPriority:RACSchedulerPriorityBackground]]
startWith:[NSDate date]] map:^id(NSDate *value) {
if([self.dateUntilNextEvent earlierDate:value] == self.dateUntilNextEvent){
//Stop "timer" and call an onComeplete method
return @"0";
}
NSUInteger flags = NSDayCalendarUnit
| NSHourCalendarUnit
| NSMinuteCalendarUnit
| NSSecondCalendarUnit;
NSDateComponents *components = [[NSCalendar currentCalendar] components:flags
fromDate:value
toDate:self.dateUntilNextEvent options:0];
return [NSString stringWithFormat:@"%02ld : %02ld : %02ld : %02ld",
(long)[components day], (long)[components hour],
(long)[components minute], (long)[components second]];
}] deliverOn:RACScheduler.mainThreadScheduler];
RAC(self.countdownLabel,text) = countdownSignal;
任何帮助都会得到满足,或者只是指向哪个方向!
答案 0 :(得分:2)
当某个谓词变为真时,您可以使用-takeUntilBlock:
关闭信号:
@weakify(self);
RAC(self.countdownLabel, text) =
[[[[[RACSignal interval:1
onScheduler:[RACScheduler schedulerWithPriority:RACSchedulerPriorityBackground]]
startWith:[NSDate date]]
takeUntilBlock:^BOOL(NSDate *date) {
@strongify(self);
return [self.dateUntilNextEvent compare:date] == NSOrderedAscending;
}]
map:^id(NSDate *date) {
// Your NSCalendar/NSString transformation here.
}]
deliverOn:RACScheduler.mainThreadScheduler];
完全不相关:
您还提到您刚开始使用ReactiveCocoa。新用户的一个问题是当一个对象保留一个信号时,该信号由对同一个对象进行强引用的块组成。
在-map
中,您已引用self
。因此,该块将取得self
的所有权(增加其保留计数),然后当该块被赋予该信号时,该信号取得该块的所有权,然后最终将该信号绑定到{{1你的self.countdownLabel
取得了信号的所有权。
因此,请注意我的self
我使用了-takeUntilBlock
技术。请务必阅读此内容,或者在代码中引入保留周期。