【问题标题】: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 已经过去了多少秒。