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