1

我正在做一个需要计时器的应用程序。我尝试过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]);
}
4

4 回答 4

6

用于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. 顾名思义,唯一的保证是您的块将在特定时间后执行。如果有任何东西阻塞了线程,你的阻塞将不得不等待。

于 2015-01-30T01:14:26.747 回答
4

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

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

除了@CJ Foley 建议的链接外,您还可以查看dispatch_after功能。

于 2012-03-16T13:39:45.747 回答
3

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

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

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

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

于 2012-06-27T18:20:56.237 回答
0

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

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

于 2012-03-16T13:24:25.220 回答