как получить точный таймер в ios - PullRequest
1 голос
/ 16 марта 2012

Я делаю приложение, которому нужен таймер. Я пробовал NSTimer, но NSTimer всегда проигрывает или задерживается. Есть ли в iOS SDK класс, который может точно регистрировать время. Точность от 20 до 40 мс - это нормально. Я хотел бы иметь возможность изменить изображение в фиксированный интервал времени.

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

Ответы [ 4 ]

5 голосов
/ 30 января 2015

Используйте для этого CADisplayLink.Срабатывает с частотой кадров системы: 60 кадров в секунду или 17 мс.

Если вам нужен более длинный интервал, вы можете настроить его на частоту кадров, например, каждый 2-й или 3-й кадр.

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

Он предназначен для пользовательского интерфейса, который должен обновлять каждые n кадров.

Не использовать dispatch_after.Как следует из названия, единственной гарантией является то, что ваш блок будет исполнен после определенного времени.Если что-то блокирует поток, вашему блоку придется подождать.

4 голосов
/ 16 марта 2012

NSTimer не является таймером высокого разрешения.Из документации класса NSTimer:

Из-за различных входных источников, которыми управляет типичный цикл выполнения, эффективное разрешение временного интервала для таймера ограничено порядка 50-100 миллисекунд..

В дополнение к ссылке, предложенной @CJ Foley, вы можете проверить функцию dispatch_after.

2 голосов
/ 27 июня 2012

Рассматривали ли вы использование таймера источника отправки? Из того, что я наблюдал до сих пор, этот таймер очень точен.

Вот ссылка на руководство по программированию от Apple:

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

Просто проверьте подраздел: «Создание таймера».

0 голосов
/ 16 марта 2012

Возможно, ваши результаты ложно отрицательны из-за того, как вы тестируете NSDate?

В этом вопросе обсуждается, как получить точность в миллисекундах от NSDate.

...