在应用程序处于后台时,CADisplayLink 可以 运行 吗?

Can CADisplayLink be run while in application is in background?

我在我的应用程序中使用 CADisplayLink 作为计时器。我正在使用 CADisplayLink,因为我的应用严重依赖于 CADisplayLink 的 accuracy/precision。就我而言,NSTimer 不是合适的替代品。

问题是,有时我需要 CADisplayLink 在应用程序处于后台时触发并调用其选择器。这可能吗?我知道 CADisplayLink 已 link 调整为应用程序的刷新率 UI。这是否意味着,当我的应用程序在后台运行时,没有 UI,因此在这种情况下无法使用 CADisplayLink?或者,是否可以通过更改我添加的 运行 循环或更改 forMode 参数来以某种方式使用 CADisplayLink?或者可能使用一些 GCD trickery/work-around?

注意:我的应用程序使用的是 AudioPlayer,因此我启用了后台功能。我可以在后台 运行 其他代码。只是为了测试,我用 NSTimer 切换了我的 CADisplayLink,然后 NSTimer 按我的意愿触发并调用了它的选择器。我只是无法启动 CADisplayLink,而且我找不到任何关于在后台使用它的可能性的权威文档

这是与我的显示器相关的当前代码 link:

func beginTimer(){

  dispatch_async(dispatch_get_main_queue()){
      self.displayLink = CADisplayLink(target: self, selector: "update")
      self.displayLink.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
  }
}

func update(){
  delegate?.executeCallback
 }

您的显示 link 回调未在后台调用,这是一种未记录的感觉,因为您无论如何都不应该绘图(事实上,如果您在后台执行任何 GPU 工作,您的应用被杀死)。

因此,如果您已经在使用音频和后台模式,为什么不尝试通过使用 remoteIO 音频单元* 播放音频并计算输出样本而不是屏幕刷新来实现计时?

通过此路径,您可以选择等于或小于通常的 60Hz 屏幕刷新率的输出缓冲区大小。

我认为您应该能够获得可比较(也许更好)的计时精度,尽管在低功耗模式/其他应用程序交互中会有警告,iOS 可能会选择从下方更改缓冲区大小你。需要进行一些实验。

*我认为 AVAudioEngine 还没有与此程序输出等效的内容。