我想在文本字段中显示应用程序中的时间(包括秒数),非常简单。我目前所做的是创建一个每 0.1 秒运行一次的 NSTimer,它获取系统时间并更新文本字段。这似乎是一种非常低效的方法来实现这一点。有没有更好的办法?
4 回答
您是否以十分之一秒(或更精细)的分辨率显示它?
如果是这样,我认为没有问题。通常,投票很糟糕,因为您检查的内容可能没有改变,但时间不会停止在您身上。所以一个十分之一秒的计时器就可以了。
如果不是,则创建一个间隔为所需分辨率的计时器,然后获取其触发日期,将其向下舍入到所需的分辨率(例如,如果您每秒更新一秒),并将其设置为新的触发日期。然后,您的计时器只会在适合更新时钟视图的时间同时触发。
请注意,虽然时间总是在移动,但它并不总是线性移动:它可能会向前或向后跳一小时或半小时,或者如果用户(或 ntpd)更改系统时钟设置,则可以任意量。在 Mac OS X 10.6 及更高版本上,您可以观察NSSystemClockDidChangeNotification
,并在发生这种情况时重新调整计时器的触发日期。
您如何使用每秒运行的 NSTimer,然后检查触发时间并确保它恰好在一秒的开始。您可以在创建计时器后initWithFireDate:interval:target:selector:userInfo:repeats:
适当地使用或设置下一次调用时间:setFireDate:
NSTimeInterval interval = [[timer fireDate] timeIntervalSinceReferenceDate];
NSTimeInterval nextFire = ceil(interval);
[timer setFireDate: [NSDate dateWithTimeIntervalSinceReferenceDate: nextFire];
然后,您将确保计时器在尽可能接近所需时间的情况下触发,并且不必担心计时器滞后,因为它会在每次触发后使用您提供的预期触发日期和间隔自行重置,因此它将始终尝试精确秒触发(但只要运行循环能够做到这一点就会触发)。
我不确定还有什么会更有效。只要您的计时器的回调没有做任何过于密集的事情,您就可能接近最佳状态。
怎么用gettimeofday(2)
?它返回许多准确的时间信息以供使用。