目前尚不清楚文档中要做什么。我的理解是:
- 任务继承其参与者上下文,因此从这里的主体内部,它将成为主要参与者。
- 任何异步函数都可能进入协作线程池,因此它可能会脱离主线程运行。
我不确定的是,这个设定是否data
会隐含在主角身上。
struct ExampleView: View {
@State private var data = "Initial data"
var body: some View {
Text(data)
.onAppear {
Task {
let fetchedData = await fetchData()
await MainActor.run {
data = fetchedData // Explicitly updating on the main thread
}
}
}
}
func fetchData() async -> String {
// Simulate a network request or heavy computation
await Task.sleep(1_000_000_000) // 1 second delay
return "Updated data"
}
}
正确,所以
data
即使没有,也会设定在主角身上MainActor.run
。显示这一点的一个简单方法是将其标记data
为@MainActor
,将其与主要参与者隔离。您仍然可以设置,data
无需Task
等待。如果异步函数没有与主要参与者隔离,那么是的。但所有其他不与主要参与者隔离的代码也是如此。
Task.detached { ... }
您始终可以使用或Task { ... }
在不与主要参与者隔离的上下文中在协作线程池中的某个线程上运行代码:不会。如果一个任务与主要参与者隔离,它将始终在主线程上运行。如果它与其他某个参与者隔离,则它将始终在该参与者上运行(尽管它运行的线程可能会发生变化,因为参与者和线程没有一对一的关系)。
旁注:您可以写
.task { ... }
代替.onAppear { Task { ... } }
.