Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 应用程序中的CADisplayLink是否可以在后台运行?_Ios_Swift_Cadisplaylink_Background Mode - Fatal编程技术网

Ios 应用程序中的CADisplayLink是否可以在后台运行?

Ios 应用程序中的CADisplayLink是否可以在后台运行?,ios,swift,cadisplaylink,background-mode,Ios,Swift,Cadisplaylink,Background Mode,我在应用程序中使用CADisplayLink作为计时器。我使用的是CADisplayLink,因为我的应用程序在很大程度上依赖于CADisplayLink的准确性/精确度。在我的情况下,NSTimer不是合适的替代品 问题是,有时,当应用程序处于后台时,我需要启动CADisplayLink并调用其选择器。这可能吗?我知道CADisplayLink与应用程序UI的刷新率相关联。这是否意味着,当我的应用程序在后台时,没有UI,因此在这种情况下不可能使用CADisplayLink?或者,是否可以通过更

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

问题是,有时,当应用程序处于后台时,我需要启动CADisplayLink并调用其选择器。这可能吗?我知道CADisplayLink与应用程序UI的刷新率相关联。这是否意味着,当我的应用程序在后台时,没有UI,因此在这种情况下不可能使用CADisplayLink?或者,是否可以通过更改我添加到的运行循环或更改
forMode
参数以某种方式使用CADisplayLink?或者可能使用一些GCD技巧/变通方法

注意:我的应用程序使用音频播放器,因此我启用了后台功能。我可以在后台运行其他代码。为了测试,我用一个NSTimer切换了我的CADisplayLink,然后NSTimer启动并调用了我想要的选择器。我只是无法获得fire的Cadisplay链接,也找不到任何关于在后台使用它的可能性的明确文档

以下是我的显示链接的当前代码:

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
还没有类似于这个过程输出的功能。

我想责怪你没有尝试学习你自己问题的答案。然后我更深入地阅读了你们的讨论,并决定不仅要进行实验,而且要进行明确的实验。你肯定回答了你自己的问题!谢谢@matt,我想你是对的。我只是希望我能想尽办法。你知道有哪个计时器比CADisplayLink更准确/同样准确吗?我不需要在间隔之间进行高度的判断(即:可以接受0.5秒的间隔),我“只”需要一个非常一致或准确的计时器。我可以保证每0.5秒发射一次,每次发射时间为1/2秒。这在iOS中存在吗?“这在iOS中存在吗”不,不存在。毕竟,甚至连CADisplayLink都不是完全正常的。除此之外,考虑一下:如果它着火,那一瞬间的主线在忙呢?简言之,如果你不愿意接受某种程度的抖动,那么无论你使用什么,你都将是一个非常不快乐的露营者。感谢你的洞察力,我将不得不对此进行调查。你知道在iOS中有什么方法可以做到这一点吗?不幸的是,我找不到任何文字。使用AVAudioEngine,您可以使用installTap函数来实现这一点。()