在一个实际的app项目中,当运行以下代码时,print语句按照1->3->2的顺序出现:
var body: some View {
Text
.onAppear {
print("1")
Task {
print("2")
}
print("3")
}
}
字符串
然而,当在Playground中执行等效代码时,print语句以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吗?
1条答案
按热度按时间q9rjltbz1#
旧版本
这是因为在app项目中,你的代码实际上是这样开始的:
@main //魔法在这里!
Struct ExampleSwiftUIApp:App {
更新
正如@Rob在一个实际的应用程序项目中指出的那样:
主要参与者的隔离更直接地源于视图的主体
站立点
所以app项目中的
Task
运行on behalf of the current actor(这里是main)。所以代码执行like on main queue。主队列是serial,所以在app示例中保证顺序1->3->2。现在让我们看一下在Playground-example.这里你正在创建没有actor的任务.没有actor的任务与代码的基本流同时运行.在你的示例中,基本流是
print("3")
.是的,print("3")
运行在主线程上.但是.没有主actor,所以我相信在Playground中字符串
产生分离的任务。因此执行
2
与3
的顺序不能保证,可能取决于优先级,空闲CPU内核的数量等。