ReactiveCocoa倒计时到目前为止

时间:2015-08-28 14:58:06

标签: objective-c reactive-cocoa

刚开始使用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;

任何帮助都会得到满足,或者只是指向哪个方向!

1 个答案:

答案 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技术。请务必阅读此内容,或者在代码中引入保留周期。