【问题标题】:how to run countdown using NSDate?如何使用 NSDate 运行倒计时?
【发布时间】:2010-01-30 13:24:21
【问题描述】:

我开发了一个运行倒数计时器的应用程序。计时器每秒触发一个方法。但是,当手机处于睡眠模式时,定时器会变慢甚至关闭。

我认为我需要通过使用 NSDate 计算时间间隔来更新变量。有人知道该怎么做吗?

顺便说一句,我们的客户已经发送了以下反馈:

计时器问题似乎是由 由于代码假设 计时器通知消息是 恰好在一秒钟内交付,但是 不是。当应用程序正在运行但 手机处于待机状态,它使用 timer 来更新倒数计时器。 但是计时器来得更慢 超过一秒,所以倒计时 定时器关闭。该应用程序应该是 重新设计以始终更新 基于当前的倒数计时器 时间,而不是根据 计时器消息本身。 (其他 话,当一秒钟的消息 进来,总是假设 额外的时间过去了 计算剩余时间 从目标时间中减去。这 是当你重新启动时会发生什么 app——它计算出目标时间 和当前时间减一 从另一个,并更新 屏幕计时器。嗯,就是这样 应该总是这样做。)

如果有人了解我们究竟需要什么,请告诉我。

【问题讨论】:

    标签: objective-c iphone-sdk-3.0 nstimer


    【解决方案1】:

    NSTimers 永远不应该用于实际计时。它们依赖于运行循环,因此可能会受到需要很长时间才能运行的代码的干扰。

    您应该在applicationWillResignActive: 中停止计时器并在applicationDidBecomeActive: 中恢复(实际上,创建另一个计时器)。

    要计算日期,您需要以下内容:

        NSDate *startDate=[NSDate date];
        NSDate *endDate=[startDate addTimeInterval:someSeconds];
        NSTimeInterval secsElapsed;
        ...
    
    -(void) timerDidFire:(NSTimer *) aTimer{
        NSDate *dateNow=[NSDate date];
        if ([[dateNow laterDate:endDate] isEqual:endDate]) {
            [aTimer invalidate];
            // end countdown
        }else {
            secsElapsed=[dateNow timeIntervalSinceDate:startDate];
        }
    }
    

    【讨论】:

      【解决方案2】:

      使用纪元时间。纪元时间是自 1970 年 1 月 1 日以来的秒数。

      程序启动时,保存当前epoch时间

      double start = [[NSDate date] timeIntervalSince1970];
      

      然后当你更新你的计时器时,

      double running = [[NSDate date] timeIntervalSince1970] - start;
      

      会告诉你距离start 已经过去了多少秒。

      【讨论】:

      • [NSDate date] 当前时间。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      相关资源
      最近更新 更多