我开发了一个应用程序,我正在运行倒数计时器。计时器每秒触发一次方法。但是,当手机处于睡眠模式时,计时器会变慢甚至关闭。
我想我需要通过使用NSDate计算时间间隔来更新变量。有人知道怎么做吗?
BTW,我们的客户发送了以下反馈:显示计时器问题 由代码假定的事实 计时器通知消息是 只需一秒钟即可送达,但是 不是。当应用程序运行但是 手机处于待机状态,它使用的是 计时器更新倒数计时器。 但计时器的进展速度更慢 比一秒钟,所以倒计时 计时器关闭。该应用程序应该是 重新设计以便始终更新 基于当前的倒数计时器 时间,而不是倒计时 计时器消息本身。 (其他 单词,当一秒钟的消息 进来,总是假设 额外的时间已经过去了 计算剩余时间 从目标时间中减去。这个 是重新启动时会发生什么 应用程序 - 它计算出目标时间 和当前时间一样,减去一个 从另一个,并更新 屏幕计时器。嗯,这是怎么回事 应该经常这样做。)
如果有人明白我们需要什么,请告诉我。
答案 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
以来经过了多少秒。