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

Posted

技术标签:

【中文标题】在异步后台线程上运行 CADisplayLink 的正确方法?【英文标题】:Proper way to run CADisplayLink on async background thread? 【发布时间】:2021-07-24 03:00:28 【问题描述】:

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 函数添加断点时,它显示它位于主线程上:

它似乎在主线程上?

【问题讨论】:

【参考方案1】:

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

我怀疑没有办法做到这一点。

【讨论】:

我希望它在屏幕更新时触发,但一旦触发就在后台执行。似乎有可能,或者为什么 CADisplayLink 有线程选项?

以上是关于在异步后台线程上运行 CADisplayLink 的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章

在后台运行长时间运行的并行任务,同时允许小型异步任务更新前台

如果异步方法是单线程的,它如何在后台运行?

JavaScript 编程模型及异步编程讲解

(82)Wangdao.com第十六天1017__ JavaScript 异步操作

IASyncResult接口实现简单异步编程(C#)

后台任务永远运行?