1

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

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

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

计时器问题似乎是由于代码假定计时器通知消息恰好在一秒钟内传递的事实引起的,但事实并非如此。当应用程序正在运行但手机处于待机状态时,它会使用计时器来更新倒数计时器。但是计时器来的慢于一秒,所以倒数计时器关闭了。应重新设计应用程序以始终根据当前时间更新倒计时计时器,而不是根据计时器消息本身进行倒计时。(换句话说,当一秒钟的消息进来时,总是假设额外的时间已经过去,并通过从目标时间中减去来计算剩余时间。这就是当你重新启动应用程序时发生的事情——它会计算出目标时间和当前时间,从另一个减去一个,并更新屏幕计时器。好吧,这就是它应该始终这样做的方式。)

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

4

2 回答 2

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];
    }
}
于 2010-01-30T16:41:23.940 回答
2

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

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

double start = [[NSDate date] timeIntervalSince1970];

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

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

会告诉你多少秒过去了start

于 2010-01-30T13:36:34.930 回答