在 Swift 并发模型中,nonisolated 表示“不属于任何 Actor 隔离域”。它用于明确告诉编译器:某个方法或属性不受 Actor(包括 MainActor)保护,可以从任意并发上下文直接访问。
可以理解为:
nonisolated 成员不运行在 Actor 的 executor 上,也不需要 await,不受 Actor 数据隔离规则约束。
基本用法
在@MainActor类中,方法添加nonisolated关键字。
例如:
@MainActor
class FileProcessingService {
nonisolated getName() { ... }
getAge() { ... }
}
添加nonisolated关键字的方法,可以在任意线程中调用,不需要await,也不会触发Swift 6错误。
Swift 6 错误
nonisolated适用于在非主线程的任务中,调用MainActor方法。
例如,TaskGroup的addTask是一个非MainActor的同步上下文。
group.addTask {
self.getName() // Xcode弹出错误提示
}
如果getName(示例)是一个MainActor类中的方法,默认只能在主线程中调用。在addTask中调用时,会提示:
Call to main actor-isolated instance method … in a synchronous nonisolated context; this is an error in the Swift 6 language mode
因为getName不支持非主线程中调用。
解决方案为,getName添加nonisolated关键字,添加后,getName可以被任意后台调用,并且不会触发Swift 6错误。
总结
在Actor类型中,nonisolated关键字表示这个成员不属于Actor,可以被任何并发上下文安全调用。
MainActor类中,如果方法不涉及@Published、修改ViewModel等主线程的操作,而是处理逻辑计算、数据下载等后台操作。
方法可以通过添加nonisolated关键字,在任意线程中调用,不再仅限于主线程,前提条件是这个方法不操作UI或共享状态。
