2013-06-19 46 views
1

我有一個最奇怪的問題,我不知道爲什麼會發生這種情況。我正在運行能夠在應用程序處於後臺時播放的鼓機。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應用程序沒有運行時,同樣的問題會返回。

回答

0

你已經有效地做了一個無限循環,會吃掉大量的CPU。 iOS有各種各樣的機制來最大限度地延長電池的使用壽命,當屏幕關機時可能會激活它。您需要改進計時器,以便在1個線程上100%CPU無法有效旋轉。在那裏添加一些小時間的睡眠呼叫,這樣CPU就可以減速。

+0

非常感謝您的快速響應!我曾嘗試在while循環內部放置不同的睡眠方法,但沒有任何技巧。也許我做錯了什麼或誤解了你。你能把我推向正確的方向嗎?你會使用哪種睡眠方法,應該睡多久?重要的是要提到我需要每50毫秒最多一次擊鼓。 – imilakovic