swift 任务的行为似乎在Playground环境中有所不同

esyap4oy  于 2024-01-05  发布在  Swift
关注(0)|答案(1)|浏览(140)

在一个实际的app项目中,当运行以下代码时,print语句按照1->3->2的顺序出现:

  1. var body: some View {
  2. Text
  3. .onAppear {
  4. print("1")
  5. Task {
  6. print("2")
  7. }
  8. print("3")
  9. }
  10. }

字符串
然而,当在Playground中执行等效代码时,print语句以1->2->3的顺序出现:

  1. print("1")
  2. Task {
  3. print("2")
  4. }
  5. print("3")


在Playground环境中进行了几次测试后,我观察到在mainActor上运行Task内部的函数或显著降低Task的优先级(例如,.background),结果顺序为1->3->2:

  1. print("1")
  2. Task { @MainActor in
  3. print("2")
  4. }
  5. print("3")
  6. // or
  7. print("1")
  8. Task(priority: .background) {
  9. print("2")
  10. }
  11. print("3")


但是,如果没有这些额外的配置,我相信Playground中的打印顺序也应该是1->3->2。
你能解释一下为什么Playground的执行顺序是1->2->3吗?

q9rjltbz

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中

  1. Task {
  2. print("2")
  3. }

字符串
产生分离的任务。因此执行23的顺序不能保证,可能取决于优先级,空闲CPU内核的数量等。

展开查看全部

相关问题