swift 在异步后台线程上运行CADisplayLink的正确方法?

ktca8awb  于 2023-06-04  发布在  Swift
关注(0)|答案(2)|浏览(260)

什么是使CADisplayLink回调函数在后台线程上运行的正确方法?我正在使用以下命令创建显示链接:

let displayLink = CADisplayLink(target: self, selector: #selector(self.renderBackground))
        
if let displayLink = displayLink {
    displayLink.preferredFramesPerSecond = 30
    DispatchQueue.main.async {
        displayLink.add(to: .current, forMode: .common)
     }
}

这是有效的,但是当我向renderBackground函数添加断点时,它显示它在主线程上:

它似乎在主线上?

x7rlezfr

x7rlezfr1#

CADisplayLink旨在提供与屏幕刷新同步的回调,屏幕刷新发生在主线程上。将主线程上发生的事件与另一个线程上的调用同步是没有意义的。
我怀疑没有办法做到这一点。

r7xajy2e

r7xajy2e2#

DispatchQueue.main.async {
    displayLink.add(to: .current, forMode: .common)
}

CADisplayLink.add(to: .current, …)将在当前线程的run循环上调度回调。由于您使用了DispatchQueue.main,此时的当前线程仍然是主线程,因此回调将继续在主线程上发生。
你可以在后台线程上获取它们,如果你执行以下操作:

  • 启动一个后台线程(我不推荐使用GCD/DispatchQueue,因为你会让这个线程保持忙碌,从而防止GCD满负荷运行)
  • 从这个后台线程:调用displayLink.add(to: .current, forMode: .common)
  • 从这个后台线程:只要您需要接收CADisplayLink更新,请在RunLoop.current上使用其中一个RunLoop.run(…)方法。

相关问题