0

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

int totalSeconds;
int totalMinutes;
int totalHours;

如果 totalSeconds 为 60,totalMinuts 变为 +1。它非常简单,应该可以工作。例如,我将 NSTimer 与我的 mac 的时钟一起启动。(在模拟器上运行)。当我查看我的 mac 的时钟和计时器并比较前 10-20 秒的时间时,它的计数完全同步。之后它会波动或前进 5 秒或更长时间。所以我输出了我的计时器并发现了这个:

  • 2012-10-24 14: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-24 14:45:46.002 xxApp 驱动时间:0:0:47

如您所见,毫秒计时为 002。但在第三行是 813。这非常随机地发生并导致波动。

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

4

1 回答 1

2

来自NSTimer 文档

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

如果您的目标是计算自程序开始运行以来经过的总时间,这很容易。一旦你想开始跟踪时间,就存储-[NSDate date]到一个变量中。每当您想计算已经过去了多少时间时,-[NSDate date再次调用并执行以下操作,假设originalDate是您存储第一次调用结果的属性-[NSDate date]

NSDate *presentDate = [NSDate date];
NSTimeInterval runningTime = [presentDate timeIntervalSinceDate:originalDate];

runningTime将是自您开始跟踪时间以来经过的总秒数。为了获得小时数、分钟数、秒数等,NSDateComponents应该使用一个对象。

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

于 2012-10-24T13:39:26.300 回答