iPad/iOS 时间问题

iPad/iOS timing problems

最近有人就 iPad 节拍器与我联系,该节拍器在计时方面存在一些相当微妙的问题。我使用过许多 OS X 应用程序,这些应用程序在计时方面没有问题 - 它们非常准确。

他做的小组都是面向UI的东西,我不确定他们是否知道如何在iOS上设置时间。我将从他们那里获取源代码,但我只是想确定- iPad/iOS 是否有时间问题?

计时器的准确性取决于您使用的方法。如果他们使用 NSTimer,它不会像 Apple documentation:

中描述的那样非常准确

Because of the various input sources a typical run loop manages, the effective resolution of the time interval for a timer is limited to on the order of 50-100 milliseconds. ... Therefore, the actual time at which the timer fires potentially can be a significant period of time after the scheduled firing time.

但是,CADisplayLink 与块回调配对是一种令人难以置信的 准确计时方法。检查他们使用的是哪一个,如果他们使用 NSTimer.

,则重构为 CADisplayLink

半 Sudo 代码示例(从个人项目中提取):

- (CADisplayLink*)displayLink{
    _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(timerFired:)];
    _displayLink.frameInterval = 1;// 1 = Fire every time the frame updates
    [_displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}

- (void)timerFired:(CADisplayLink*)displayLink {

    for (TTRunLoopCallbackRegistrant *registrant in _timerRegistrants) {

        if (registrant.target && registrant.callback) {
            registrant.callback();
        }
    }
}

遗憾的是,CADisplayLink 只能提供整数值,不能提供浮点值。这意味着它不会起作用。我需要看看客户是否希望我继续使用高精度计时器,看看它们是否有效。