Swift并发关键字nonisolated
Swift并发关键字nonisolated

Swift并发关键字nonisolated

在 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或共享状态。

相关文章

1、Swift并发Actor隔离

2、Xcode报错:Call to main actor-isolated instance method in a synchronous nonisolated context; this is an error in the Swift 6 language mode

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注