2010-01-30 62 views
1

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

我想我需要通过使用NSDate计算时间间隔来更新变量。有人知道如何做到这一点?

顺便说一句,我们的客户发送了以下意见:

计时器问题似乎是由该代码假定 的计时器通知消息 正好1秒交付的事实,引起 ,但 不是。当应用程序运行但 手机处于待机状态时,它使用 计时器更新倒数计时器。 但是,定时器进入缓慢 比一秒钟,所以倒计时 定时器关闭。该应用程序应该重写为 ,以始终根据当前的 时间更新 倒计时计时器,并且不会基于计时器消息本身倒计时。 (在其他 也就是说,当一个第二消息 到来时,总是假设 额外的时间已经过去了, 通过 从目标时间减去计算剩余时间该 是当你重新启动 应用发生了什么 - - 它计算出的目标时间 和当前时间,减去从另一个 ,并更新 屏幕上的计时器好了,这是怎么了 应该始终做到这一点)

如果有人了解。我们确实需要,请告诉我。

回答

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]; 
    } 
} 
2

使用纪元时间。大纪元是因为Janury 1日的秒数,1970年

程序启动时,保存当前时代的时间

double start = [[NSDate date] timeIntervalSince1970]; 

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

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

威尔告诉你自start以来已经过了多少秒钟。

+2

[NSDate的日期] _is_当前时间。 – 2010-01-30 14:08:11

+0

啊,谢谢,我不确定 – 2010-01-30 19:04:56