我有一個最奇怪的問題,我不知道爲什麼會發生這種情況。我正在運行能夠在應用程序處於後臺時播放的鼓機。iPhone屏幕關閉時的方法執行延遲
這裏是我的精確定時的實現:
- (void)run
{
uint64_t interval = [self computeInterval];
mach_timebase_info_data_t info;
mach_timebase_info(&info);
uint64_t currentTime = mach_absolute_time();
currentTime *= info.numer;
currentTime /= info.denom;
uint64_t nextTime = currentTime;
dispatch_queue_t mainQueue = dispatch_get_main_queue();
while (_running) {
if (currentTime >= nextTime) {
dispatch_async(mainQueue, ^{
[_delegate accurateTimerDidTick:self];
});
interval = [self computeInterval];
nextTime += interval;
}
currentTime = mach_absolute_time();
currentTime *= info.numer;
currentTime /= info.denom;
}
}
我
- (void)start
{
self.running = YES;
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
}
啓動它。當應用進入後臺,它完美的作品,或者至少是一樣的,當應用程序是在活動狀態。即使屏幕被鎖定,它也能正常工作,但是當屏幕熄滅時,它會開始窒息或放慢速度。因此,無論應用狀態如何,在屏幕關閉或打開時,性能的唯一區別是顯而易見的。
任何想法爲什麼會發生這種情況將不勝感激!
非常感謝您提前。
更新1: 不可思議的事:我開始檢查與Audiobus的應用程序,他們推薦的第一個測試整合來運行應用程序,同時Audiobus也運行看看是否有任何故障或延遲的聲音。猜猜看 - 它現在完美無缺!屏幕開啓/關閉沒有區別。我不確定這是否好,因爲現在我更加困惑。當然,當Audiobus應用程序沒有運行時,同樣的問題會返回。
非常感謝您的快速響應!我曾嘗試在while循環內部放置不同的睡眠方法,但沒有任何技巧。也許我做錯了什麼或誤解了你。你能把我推向正確的方向嗎?你會使用哪種睡眠方法,應該睡多久?重要的是要提到我需要每50毫秒最多一次擊鼓。 – imilakovic