Concurrency|Swift 6.2 让并发更容易控制

Swift Concurrency 实际上包含异步和并发两个部分,他们是不同的概念:

  • 异步:async/await 语法,让代码不阻塞当前线程,后续代码可以继续执行。
  • 并发:使用 Task 与 Actor 等并发原语,控制任务在哪个线程执行。

以下是关于 Swift Concurrency 的几个核心:

1 - 使用异步,并不意味着一定在后台线程执行

实际上,在大部分情况下,任务仍然在调用它的线程中执行 —— 这避免了数据竞争的问题,但仍然可能运行卡顿。

对于耗时但轻量级的任务,使用异步能很好的解决卡顿问题,最常见的场景是处理网络请求。然而,对于一些非常消耗性能的繁重任务,如果在主线程执行,即使使用异步语法,也会导致运行卡顿 —— 因为主线程资源可能被耗尽。

2 - 可以使用 Task 控制任务执行的线程

理想情况下,对于繁重的任务,应当将它从主线程剥离分派到后台线程执行,从而保证 App 界面运行流程 —— 你确实可以使用 Task/Task.detach 来实现这一点。

然而,让跨线程执行任务的难点在于“如何确保它们的数据同步”,这可能会导致大量和数据竞争相关的并发错误,你需要手动处理这些问题 —— 这正是并发编程最困难的地方。

Swift 从 5.0 开始引入的 Sendable、Actor 等语法,都是为了解决数据竞争的问题。

3 - 系统 API 导致的并发错误

即使你没有显式将任务分派到后台线程执行,Swift 框架的一些系统级 API,仍然可能导致数据竞争错误。因为某些系统级 API 可能会强制让任务在后台线程执行,例如图像处理相关 API。

在 Swift 6.2 中,Swift Concurrency 在几个方面做了重大更新,让并发编程变得更容易控制。

Xcode 26 Beta 1

推荐在 Xcode 26 中启用如下配置。

默认为 No、Mini
默认为 Swift 5

这是 By 项目设置,而非全局有效,因此需要在每个 Project 中都进行改设置。

默认安全

从 Swift 6.2 开始,所以代码默认在主线程执行,包括系统 API。

仅在你需要的时候,手动引入并发编程,例如,

  • 需要使用网络请求:引入异步
  • 需要使用大计算量:引入并发

新的  @concurrent 宏

它提供了一种从 actor 切换的机制,允许非隔离方法在不同的隔离域中运行。

@concurrent 告诉 Swift 在后台运行该函数。同时,Xcode 编译器会帮助发现并发错误: