gpt4 book ai didi

swift - 如何保证任何DispatchQueue(或OperationQueue)仅在异步任务的非主线程中运行?

转载 作者:行者123 更新时间:2023-11-30 10:51:53 24 4
gpt4 key购买 nike

到目前为止,我找不到任何有关此功能的提及。 AFAIK,根据定义,任何 GCD 队列都可以在主线程中运行。如果任务繁重的 GCDQ 选择主线程来执行,则会对 UI 产生不良影响。 (我说的是 DispatchQueue.async 案例)

这种情况的典型解决方法是如果当前线程被检测为主线程则跳过任务。但这会浪费系统资源并引入不必要的复杂性。我相信必须有一种声明性的方式来做到这一点。

还有什么更好的办法吗?我有各种大小的任务不应在主线程上运行。我尝试生成一个单独的线程,但效果不佳,因为 macOS 缺少未命名信号量。虽然 DispatchSemaphore 是使用未命名信号量实现的,但我不确定将 DispatchSemaphore 与 pthread 一起使用是否安全,因为它是 GCD 级别对象。

最佳答案

到目前为止,最好的方法是将服务质量级别设置为后台。

根据this document ;

... the system runs items on a thread whose priority is set for background status. ...

还有这个document表示 GUI 应用程序的“主线程”的默认 QoS 设置为“用户交互”。

... In an app, the main thread runs at a QoS level of user-interactive. ...

目前尚不清楚 QoS 级别是否可以在以后更改。无论如何,在默认设置下,系统不会将 QoS 级别较低的 GCD 任务发送到主线程。如果没有这样的线程可用,系统将生成一个新线程。

这是我的想法,我仍然无法从官方文档中找到对此的明确提及。

关于swift - 如何保证任何DispatchQueue(或OperationQueue)仅在异步任务的非主线程中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54377408/

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