Самое простое и достаточно точное решение - просто использовать NSTimer
. Я создал простое демонстрационное приложение, чтобы протестировать его, и оно было с точностью до тысячной доли миллисекунды (я просто NSLog
гед каждый раз, когда тикал таймер).
2010-02-07 17:11:07.548 TimerTest[12775:207] Ticked
2010-02-07 17:11:07.648 TimerTest[12775:207] Ticked
2010-02-07 17:11:07.748 TimerTest[12775:207] Ticked
2010-02-07 17:11:07.848 TimerTest[12775:207] Ticked
2010-02-07 17:11:07.948 TimerTest[12775:207] Ticked
2010-02-07 17:11:08.048 TimerTest[12775:207] Ticked
2010-02-07 17:11:08.148 TimerTest[12775:207] Ticked
Это вывод с устройства iPod Touch 2nd Gen. (Обратите внимание, что точность будет снижаться, если вы тем временем выполняете сложную обработку, но я не думаю, что у метронома будет так много всего происходящего). Таймер пришел из очень простого кода:
[NSTimer scheduledTimerWithTimeInterval:.1 target:self selector:@selector(tick) userInfo:nil repeats:YES];
Но я полагаю, что именно звуковой код вызывает проблему. Что вы используете для воспроизведения звуков? Если это что-то кроме OpenAL, вы не можете ожидать, что он будет очень точным - он может приостановиться перед воспроизведением, после воспроизведения и т. Д. Попробуйте найти тестовое приложение и посмотрите, работает ли таймер с правильной скоростью без звука и со звуком, чтобы определить причину проблемы.