什么是使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函数添加断点时,它显示它在主线程上:
它似乎在主线上?
2条答案
按热度按时间x7rlezfr1#
CADisplayLink
旨在提供与屏幕刷新同步的回调,屏幕刷新发生在主线程上。将主线程上发生的事件与另一个线程上的调用同步是没有意义的。我怀疑没有办法做到这一点。
r7xajy2e2#
CADisplayLink.add(to: .current, …)
将在当前线程的run循环上调度回调。由于您使用了DispatchQueue.main
,此时的当前线程仍然是主线程,因此回调将继续在主线程上发生。你可以在后台线程上获取它们,如果你执行以下操作:
displayLink.add(to: .current, forMode: .common)
CADisplayLink
更新,请在RunLoop.current
上使用其中一个RunLoop.run(…)
方法。