借助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(可在任意线程)相对。