假设我在一个用@MainActor注释的类中,因此所有函数都绑定到主要参与者.我想弄明白做以下事情有什么不同:

func bar() {
  Task.detached(priority: .background) {
    await foo()
  }
}

func foo() async {
  ...
}

VS

func bar() {
  Task(priority: .background) {
    await foo()
  }
}

nonisolated func foo() async {
  ...
}

它们是一样的吗?

推荐答案

你说过:

想象一下,我在一个用@MainActor注释的班级中,所有 功能与主要角色有关.我在试着理解 不同之处在于执行以下操作:

func bar() {
  Task.detached(priority: .background) {
    await foo()
  }
}

func foo() async {
  ...
}

bar方法创建一个非 struct 化任务,因为它是一个detached任务,所以不在当前执行元上.但该任务将await使用foo方法,will在主要参与者上运行该方法.foo位于带有@MainActor标识的类中这一事实意味着,无论您调用哪个SWIFT并发上下文,它都与该参与者隔离.

但是,在这种情况下,启动一个只等待参与者隔离函数的独立任务没有什么意义.

您将继续:

VS

func bar() {
  Task(priority: .background) {
    await foo()
  }
}

nonisolated func foo() async {
  ...
}

在本例中,bar将在当前(主)参与者上启动一个任务,但它将等待foo的结果,该结果是非隔离的(即,不隔离于主参与者).

因此,区别在于第一个示例foo是参与者独立的,但在第二个示例中不是.

Swift相关问答推荐

计算Vision OS相机与Vision OS中3D模型之间的距离

Swift-Can无法在AudioKit中找出简单的麦克风效果-文件链

插入/删除视图时的Swiftui动态过渡

一组可散列的自定义元素插入相等的元素

MainActor 隔离可变存储属性为何会出现可发送错误?

在 macOS (Swift) 上获取 BSD 驱动器名称的最佳方法是什么?

SwiftUI 视图的默认成员初始化器 VS 自定义初始化器

类型 '()' 不能符合 View (除非它肯定是 View,这次没有恶作剧)

有什么方法可以快速为泛型参数分配默认值?

找不到目标AAA的 SPM 工件 - 仅限 Xcode 13.3

单元测试和私有变量

将项目引用添加到 Swift iOS XCode 项目并调试

在 SwiftUI 中,如何在 UIView 内或作为 UIView 使用 UIHostingController?

Swift - 获取本地日期和时间

SwiftUI 中的 .primary 和 .secondary colored颜色 是什么?

FCM 后台通知在 iOS 中不起作用

Swift 自定义字体 Xcode

Type 应该采用什么协议来让泛型函数将任何数字类型作为 Swift 中的参数?

如何在swift中的每N个字符处为字符串添加分隔符?

转换为 swift 3 后,视图控制器中出现奇怪的通用函数