如何在ios中获得准确的计时器

我正在做一个需要计时器的应用程序。 我尝试过NSTimerNSTimer总是输了或者迟到了。 iOS SDK中是否有可以准确记录时间的类。 精度在20ms到40ms之间是可以的。 我希望能够在固定的时间间隔内更改图像。

 NSTimer *timer1 = [NSTimer scheduledTimerWithTimeInterval:.04f target:self selector:@selector(timer1) userInfo:nil repeats:YES]; - (void)timer1 { NSLog(@"timer1 timer %@",[NSDate date]); } 

NSTimer不是高分辨率计时器。 从NSTimer类文档:

由于典型的运行循环管理各种输入源,因此定时器的时间间隔的有效分辨率被限制在50-100毫秒的量级。

除了@CJ Foley建议的链接,您还可以查看dispatch_after函数。

为此使用CADisplayLink 。 它以系统帧速率触发:60 fps或17 ms。

如果您想要更长的间隔,可以将其设置为以帧速率的倍数触发,例如每隔2帧或3帧。

 CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(timer1)]; displayLink.frameInterval = 2; [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

它意味着用于应该每n帧更新一次的UI。

不要使用dispatch_after 。 顾名思义,唯一的保证是您的块将特定时间执行。 如果有什么东西阻塞了线程,你的块将不得不等待。

您是否考虑过使用调度源计时器? 从我到目前为止观察到的,这个计时器是非常精确的。

以下是苹果编程指南之一的链接:

http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/GCDWorkQueues/GCDWorkQueues.html#//apple_ref/doc/uid/TP40008091-CH103-SW1

只需检查子部分:“创建计时器”。

由于您正在测试NSDate,您的结果可能是假阴性?

这个问题讨论了如何从NSDate获得毫秒精度。