NSTimer надежные альтернативы - PullRequest
8 голосов
/ 17 ноября 2011

У меня есть приложение, которое должно регистрировать определенные вещи каждую 1 секунду, и в настоящее время я использую NSTimer, но если мое приложение переходит на экраны (или почти что-нибудь еще, на самом деле), оно немного замедляет таймер, делая за неточные показания.

Что такое надежная альтернатива для использования? Мой текущий код выглядит следующим образом:

timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(update) userInfo:nil repeats:YES];

Ответы [ 2 ]

12 голосов
/ 17 ноября 2011

NSTimer не гарантирует, что стреляет точно вовремя, никогда.Но вы можете использовать NSTimer гораздо надежнее, чем сейчас.Когда вы используете scheduledTimerWithTimeInterval, вы создаете NSTimer, который запланирован в цикле выполнения для NSDefaultRunLoopMode.Этот режим приостанавливается, когда используется пользовательский интерфейс, поэтому ваши таймеры не будут срабатывать при взаимодействии с пользователем.Чтобы избежать этой паузы, используйте режим NSRunLoopCommonModes.Для этого вам нужно самостоятельно настроить таймер так:

timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(update) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
4 голосов
/ 17 ноября 2011

Вы могли бы:

  • Поместите NSTimer в другой поток (пользовательский интерфейс не может быть затронут таким образом)
  • Уменьшите интервал (скажем, 0,1 секунды) и в своей функции регистрации проверьте, настало ли «правильное» время для записи того, что вы хотите.
...