gpt4 book ai didi

ios - CADisplayLink 回调是否总是在主线程上运行?

转载 作者:行者123 更新时间:2023-11-29 11:27:22 26 4
gpt4 key购买 nike

我在网上和文档中都找不到任何直接的答案。如果我使用以下内容设置 CADisplayLink:

 let displayLink = CADisplayLink(target: self, selector: #selector(updateShimmer))
displayLink.add(to: .current, forMode: .common)

@objc func updateShimmer() {
print(Thread.isMainThread)
}

我说真的。我知道我可以将它包装在 DispatchQueue.main 中,但我想知道,它是否总是在主队列上调度?还是我应该把它包起来?

最佳答案

您不需要手动将显示链接处理程序中的代码分派(dispatch)到主线程。添加到特定运行循环的计时器和显示链接将始终在与该运行循环关联的线程上运行。有关详细信息,请参阅 Threading Programming Guide: Run Loops .

最重要的是,如果您add(to:forMode:) 到主运行循环,则主运行循环始终在主线程上运行。

话虽如此,如果你想确保它始终在主线程上运行,我建议明确并将其添加到 .main,而不仅仅是 .current。这消除了任何歧义:

let displayLink = CADisplayLink(target: self, selector: #selector(updateShimmer(_:)))
displayLink.add(to: .main, forMode: .common)

请注意,我还调整了 updateShimmer 的签名以接受参数。显示链接将传递给它。在方法中包含该引用通常很有用。而且,无论如何,它使一个人的代码更加不言自明:您现在只需看一眼这个方法就可以理解这是一个显示链接处理程序:

@objc func updateShimmer(_ displayLink: CADisplayLink) {
...
}

关于ios - CADisplayLink 回调是否总是在主线程上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57322965/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com