SwiftUI 中的 `Task` 和 `async` 有什么区别

What's the difference between `Task` and `async` in SwiftUI

所以我看到了这样的代码:

func doSomething() {
  async {
    let foo = await something()
  }
}

func doSomething() {
  Task {
    await doSomething()
  }
}

任务还有修改版本:

TextView(...)
  .task {
    let foo = await something()
  }

我想知道这些有什么区别,我应该使用哪一个?

async { ... } 已弃用。我什至找不到 async 函数的文档页面。它已被 Task { ... } 取代,后者使用 Taskthis initialiser

Task { ... } 将异步操作作为顶级任务运行。

另一方面,.task视图修饰符是一个视图修饰符,运行异步操作当视图出现时。重要的是,此任务与视图具有相同的生命周期。如果视图被删除,任务也会被取消。

比较:

func foo() {
    Task {
        await doWork() // gets started when foo is called
    }
}

Text("Hello")
    .task {
        // gets started when "Hello" appears,
        // *not* when .task is called
        await doWork() 
    }