我正在做一个需要计时器的应用程序。我尝试过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]);
}
答案 0 :(得分:4)
NSTimer
不是高分辨率计时器。来自NSTimer
类文档:
由于典型的运行循环管理各种输入源,因此定时器的时间间隔的有效分辨率限制在50-100毫秒的数量级。
除了@CJ Foley建议的链接外,您还可以查看dispatch_after
功能。
答案 1 :(得分:4)
使用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
。正如名称所暗示的那样,唯一的保证是您的块将在特定时间后执行。如果有什么东西阻塞线程,你的块将不得不等待。
答案 2 :(得分:2)
您是否考虑过使用调度源计时器?从我到目前为止观察到的,这个计时器非常精确。
以下是苹果编程指南之一的链接:
只需查看子部分:“创建计时器”。
答案 3 :(得分:0)
由于您正在测试NSDate,您的结果可能是假阴性?
This question讨论了如何从NSDate获得毫秒精度。