如何在ios中获得准确的计时器
我正在做一个需要计时器的应用程序。 我尝试过NSTimer
但NSTimer
总是输了或者迟到了。 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
。 顾名思义,唯一的保证是您的块将在特定时间后执行。 如果有什么东西阻塞了线程,你的块将不得不等待。
您是否考虑过使用调度源计时器? 从我到目前为止观察到的,这个计时器是非常精确的。
以下是苹果编程指南之一的链接:
只需检查子部分:“创建计时器”。
由于您正在测试NSDate,您的结果可能是假阴性?
这个问题讨论了如何从NSDate获得毫秒精度。