我正在使用NSTimer每x秒播放一次音频文件。音频文件与不断运行的进程同步,因此(据我所知),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之外,还有没有其他更可靠的工具来确保过渡到后台时不会发生延迟?
最佳答案
最终用dispatch_source_create
替换了NSTimer:
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);
这为计时器提供了专用的队列来执行,并且不会因过渡到后台而中断。
关于ios - 转换为后台时,NSTimer不可靠,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38837965/