Objective c 不稳定的NSTimer会导致计数波动

Objective c 不稳定的NSTimer会导致计数波动,objective-c,nstimer,Objective C,Nstimer,我使用NSTimer从某个时刻开始计数 int totalSeconds; int totalMinutes; int totalHours; 如果总秒数为60,则总分钟数变为+1。它非常简单,应该可以工作。 例如,我启动了NSTimer和mac的时钟。(在模拟器上运行)。 当我看我的mac电脑的时钟和计时器,比较前10-20秒的时间时,它的计数完全同步。之后,它会波动或向前移动5秒或更长时间。 因此,我输出了我的计时器并发现: 2012-10-2414:45:44.002 xxApp驾驶时

我使用NSTimer从某个时刻开始计数

int totalSeconds;
int totalMinutes;
int totalHours;
如果总秒数为60,则总分钟数变为+1。它非常简单,应该可以工作。 例如,我启动了NSTimer和mac的时钟。(在模拟器上运行)。 当我看我的mac电脑的时钟和计时器,比较前10-20秒的时间时,它的计数完全同步。之后,它会波动或向前移动5秒或更长时间。 因此,我输出了我的计时器并发现:

  • 2012-10-2414:45:44.002 xxApp驾驶时间:0:0:44
  • 2012-10-24 14:45:45.002 xxApp驾驶时间:0:0:45
  • 2012-10-24 14:45:45.813 xxApp驾驶时间:0:0:46
  • 2012-10-2414:45:46.002 xxApp驾驶时间:0:0:47
如您所见,毫秒计时为002。但在第三排是813。这是非常随机的,会引起波动

有没有更稳定的计数方法?

计时器不是实时机制;仅当添加了计时器的运行循环模式之一正在运行并且能够检查计时器的触发时间是否已过时,它才会触发。由于典型运行循环管理的各种输入源,计时器的时间间隔的有效分辨率限制在50-100毫秒左右

如果您的目标是计算自程序开始运行以来经过的总时间,那么这很容易。只要您想开始跟踪时间,就将
-[NSDate date]
存储到变量中。无论何时,只要您想计算经过了多少时间,请再次调用
-[NSDate date
,并执行以下操作,假设
originalDate
是存储第一次调用
-[NSDate date]
结果的属性:

NSDate *presentDate = [NSDate date];
NSTimeInterval runningTime = [presentDate timeIntervalSinceDate:originalDate];
runningTime
将是自开始跟踪时间以来经过的总秒数。为了获取小时、分钟、秒等数,应使用
NSDateComponents
对象


此机制允许您使用计时器“大约每秒一次”更新总运行时间,而不会丢失准确性。

谢谢,这正是我所寻找的。重建我的代码需要一段时间,因为一切都取决于计时器。但这非常有用。