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

我在我的应用程序中使用CADisplayLink作为计时器.我正在使用CADisplayLink,因为我的应用程序严重依赖于CADisplayLink的准确性/精确度.在我的情况下,NSTimer不是合适的替代品.

问题是偶尔,我需要CADisplayLink来激活并调用它的选择器,而应用程序在后台.这甚至可能吗?我知道CADisplayLink链接到应用程序UI的刷新率.这是否意味着,当我的应用程序在后台时,没有UI,因此在这种情况下不可能使用CADisplayLink?或者,是否可以通过更改我添加到其中的运行循环或通过更改forMode参数来以某种方式使用CADisplayLink?或者也许使用一些GCD技巧/解决方法?

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

这是我目前与我的显示链接有关的代码:

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
 }

最佳答案 它是一种无证的感觉,你的显示链接回调不会在后台被调用,因为你不应该正在绘制(事实上,如果你在后台做任何GPU工作你的应用程序被杀死).

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

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

我认为你应该能够获得可比较的(也许更好的)计时准确性,尽管在低功耗模式/其他应用程序交互中会有一些警告,iOS可能会选择从你下面改变你的缓冲区大小.一些实验将是必要的.

*我认为AVAudioEngine还没有相当于这个程序输出.

点赞