在实际的应用项目中,运行以下代码时,打印语句的顺序是1->3->2:
var body: some View {
Text
.onAppear {
print("1")
Task {
print("2")
}
print("3")
}
}
但是,在 Playground 中执行等效代码时,打印语句按照 1->2->3 的顺序出现:
print("1")
Task {
print("2")
}
print("3")
在 Playground 环境中进行多次测试后,我观察到在 mainActor 上运行 Task 内的函数或显着降低 Task 的优先级(例如 .background)会导致 1->3->2 的顺序:
print("1")
Task { @MainActor in
print("2")
}
print("3")
// or
print("1")
Task(priority: .background) {
print("2")
}
print("3")
但是,如果没有这些额外的配置,我相信 Playground 中的打印顺序也应该是 1->3->2。
您能解释一下为什么在 Playground 中执行顺序是 1->2->3 吗?
这是因为在应用程序项目中你的代码实际上是这样开始的:
@main // Magic here!
struct ExampleSwiftUIApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
因此,应用程序项目中的
Task
代表当前参与者(此处为 main)运行。因此代码的执行就像在主队列上一样。主队列是串行,因此在应用示例中保证顺序 1->3->2。
现在让我们看一下 in-Playground- 示例。在这里,您正在创建没有演员的任务。没有参与者的任务与基本代码流同时运行。在您的示例中,基本流量为 print("3")
。是的,
print("3")
在主线程上运行。但。没有主角,所以我相信在游乐场
Task {
print("2")
}
产生独立任务。因此,2
vs
3
的执行顺序无法保证,可能取决于优先级、可用 CPU 核心数量等。