我可以看到Swift支持2种后台任务
使用
DispatchQueue
DispatchQueue.global(qos: .background).async {}
使用
Task
Task(priority: .background) {}
所以我很困惑有什么区别以及我应该使用哪一个?
Task
是一个相对较新的 API,是 Swift Concurrency 的一部分,而 DispatchQueue
很久以前就已经存在了。如果您想在代码中采用 Swift 并发(例如编写 async
函数而不是使用完成处理程序模式),您应该使用 Task
及其相关 API。 混合使用这些通常不是一个好主意。这些是非常不同的 API,具有非常不同的底层概念。
特别是对于您显示的两个代码片段,主要区别在于
DispatchQueue.global()
不会在主线程上运行您的代码,而 Task { ... }
会 在主线程上运行您的代码(如果您从 MainActor
调用它)
-孤立的上下文。也就是说,Task.init
继承了actor上下文。要从主线程运行 Task
,请使用 Task.detached
。