Swift 中的 DispatchQueue.global(qos: .background).async {} 和 Task(priority: .background) {} 有什么区别

问题描述 投票:0回答:1

我可以看到Swift支持2种后台任务

使用

DispatchQueue

DispatchQueue.global(qos: .background).async {}

使用

Task

Task(priority: .background) {} 

所以我很困惑有什么区别以及我应该使用哪一个?

swift swiftui
1个回答
0
投票

Task
是一个相对较新的 API,是 Swift Concurrency 的一部分,而
DispatchQueue
很久以前就已经存在了。如果您想在代码中采用 Swift 并发(例如编写
async
函数而不是使用完成处理程序模式),您应该使用
Task
及其相关 API。 混合使用这些通常不是一个好主意。这些是非常不同的 API,具有非常不同的底层概念。

特别是对于您显示的两个代码片段,主要区别在于

DispatchQueue.global()
不会在主线程上运行您的代码,而
Task { ... }
在主线程上运行您的代码(如果您从
MainActor 调用它) 
-孤立的上下文。也就是说,
Task.init
继承了actor上下文。要从主线程运行
Task
,请使用
Task.detached

© www.soinside.com 2019 - 2024. All rights reserved.