iPhone屏幕关闭时的方法执行延迟

问题描述:

我有一个最奇怪的问题,我不知道为什么会发生这种情况。我正在运行能够在应用程序处于后台时播放的鼓机。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应用程序没有运行时,同样的问题会返回。

你已经有效地做了一个无限循环,会吃掉大量的CPU。 iOS有各种各样的机制来最大限度地延长电池的使用寿命,当屏幕关机时可能会激活它。您需要改进计时器,以便在1个线程上100%CPU无法有效旋转。在那里添加一些小时间的睡眠呼叫,这样CPU就可以减速。

+0

非常感谢您的快速响应!我曾尝试在while循环内部放置不同的睡眠方法,但没有任何技巧。也许我做错了什么或误解了你。你能把我推向正确的方向吗?你会使用哪种睡眠方法,应该睡多久?重要的是要提到我需要每50毫秒最多一次击鼓。 – imilakovic