- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在我的应用程序中使用 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
具有与此程序输出等效的功能。
关于ios - CADisplayLink 可以在应用程序处于后台时运行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35977411/
我是一名优秀的程序员,十分优秀!