SwiftUI 中的“Task”和“async”有什么区别

6 async-await swift swiftui

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

func doSomething() {
  async {
    let foo = await something()
  }
}
Run Code Online (Sandbox Code Playgroud)

func doSomething() {
  Task {
    await doSomething()
  }
}
Run Code Online (Sandbox Code Playgroud)

该任务还有一个修改版本:

TextView(...)
  .task {
    let foo = await something()
  }
Run Code Online (Sandbox Code Playgroud)

我想知道它们之间有什么区别,我应该使用哪一个?

Swe*_*per 15

async { ... }已弃用。它已被 取代Task { ... },它使用 的初始化程序Task

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

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

比较:

func foo() {
    Task {
        await doWork() // gets started when foo is called
    }
}
Run Code Online (Sandbox Code Playgroud)

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