MainActor 是什么

6 阅读1分钟

借助AI辅助。

MainActor 是 Swift 并发里的一个全局 actor,表示“主线程”。凡是被 MainActor 隔离的类型或成员,编译器会要求:访问和修改都必须在主线程上执行,从而避免在后台线程碰 UI 或共享状态导致崩溃/数据错乱。

  • 作用

    • 把“只能在主线程跑”的代码标出来,由编译器检查。

    • UI 相关(SwiftUI View、UIKit/AppKit 的 UI 更新)默认就是 MainActor 隔离的。

    • 项目里若开启了“默认 MainActor”(如 SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor),没标 nonisolated 的类成员会默认当成主线程隔离。

  • 和 nonisolated 的关系

    • MainActor 隔离:只能(或会切到)主线程执行。

    • nonisolated:不绑在任何 actor 上,可在任意线程执行。

    • 在 nonisolated 方法里不能直接写 MainActor 隔离的属性,否则会报 “Main actor-isolated property ... can not be mutated from a nonisolated context”。所以 MODocument.read 里要写 fileData,要么把 fileData 标成 nonisolated(unsafe),要么在主线程上做赋值。

  • 常见用法

    • @MainActor func ... / @MainActor class X:类型或方法只在主线程跑。

    • MainActor.run { ... }:把一段代码放到主线程执行。

    • await MainActor.run { ... }:在 async 里切到主线程再执行。

一句话:MainActor = 主线程的 actor,用来保证 UI 和“主线程才能碰”的状态只在主线程被访问;和 nonisolated(可在任意线程)相对。