如何使用NSDate运行倒计时?

时间:2010-01-30 13:24:21

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

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

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

BTW,我们的客户发送了以下反馈:

  

显示计时器问题   由代码假定的事实   计时器通知消息是   只需一秒钟即可送达,但是   不是。当应用程序运行但是   手机处于待机状态,它使用的是   计时器更新倒数计时器。   但计时器的进展速度更慢   比一秒钟,所以倒计时   计时器关闭。该应用程序应该是   重新设计以便始终更新   基于当前的倒数计时器   时间,而不是倒计时   计时器消息本身。 (其他   单词,当一秒钟的消息   进来,总是假设   额外的时间已经过去了   计算剩余时间   从目标时间中减去。这个   是重新启动时会发生什么   应用程序 - 它计算出目标时间   和当前时间一样,减去一个   从另一个,并更新   屏幕计时器。嗯,这是怎么回事   应该经常这样做。)

如果有人明白我们需要什么,请告诉我。

2 个答案:

答案 0 :(得分:5)

永远不应该使用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];
    }
}

答案 1 :(得分:2)

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

程序启动时,保存当前纪元时间

double start = [[NSDate date] timeIntervalSince1970];

然后当您更新计时器时,

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

告诉你自start以来经过了多少秒。