2016-08-08 3 views
0

Я использую NSTimer для воспроизведения аудиофайла каждые x секунд. Звуковые файлы в синхронизации с постоянно запущенным процессом, поэтому интервал NSTimer является кратчайшим это может быть (к моему знанию):NSTimer не надежен при переходе на задний план

self.updateTimer = [NSTimer scheduledTimerWithTimeInterval:0.02 target:self selector:@selector(updateTimerFired:) userInfo:nil repeats:YES]; 
[[NSRunLoop mainRunLoop] addTimer:self.updateTimer forMode:NSRunLoopCommonModes]; 

Моей проблема возникает при переходе к фоновому состоянию, например, когда пользователь нажимает кнопку «домой». Похоже, что таймер возникает с таймером, а метод «updateTimerFired:» не называется надежным во время перехода. Это приводит к тому, что аудиофайлы не синхронизируются, хотя после завершения перехода они восстанавливают резервную копию. Обратите внимание, что мое приложение включает в себя фоновый фоновый режим.

Есть ли более надежный инструмент, отличный от NSTimer, чтобы гарантировать, что латентность не возникает при переходе на задний план?

+0

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

+0

@MCMatan Я попытался выполнить фоновые задачи, но латентность все же произошла. Я не рассматривал местные уведомления. Я посмотрю на это и посмотрю, будут ли они работать на то, что я пытаюсь сделать. – hgwhittle

+0

Хорошо, вы должны проверить местное уведомление, возможно, оно вам подойдет. Кроме того, вы создаете NSTimer с дельта-разницей между тем для фоновой задачи или используете ли вы один и тот же? – MCMatan

ответ

1

Законченная замену NSTimer с dispatch_source_create:

self.timerQueue = dispatch_queue_create("updateTimerQueue", nil); 
self.updateTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, self.timerQueue); 
dispatch_source_set_timer(self.updateTimer, DISPATCH_TIME_NOW, (1 * NSEC_PER_SEC)/50, (1 * NSEC_PER_SEC)/20); 

dispatch_source_set_event_handler(self.updateTimer, ^{ 
    [self updateTimerFired]; 
}); 
dispatch_resume(self.updateTimer); 

Это обеспечивает выделенную очередь для таймера для выполнения дальше, и не прерывается переходом к фону.