在 SwiftUI 中,.task 是一个视图修饰符,用于在视图出现(onAppear)时启动一个异步任务。它的核心作用是在视图生命周期中执行 async/await 代码,而不需要自己手动创建 Task {}。
基本用法
struct ContentView: View {
@State private var data: String = "Loading..."
var body: some View {
Text(data)
.task {
// 这里是异步代码
data = await fetchData()
}
}
func fetchData() async -> String {
try? await Task.sleep(nanoseconds: 2_000_000_000)
return "Hello SwiftUI!"
}
}
当 ContentView 出现在屏幕上时,.task 内的异步代码会自动运行。
不需要手动调用 onAppear 再创建 Task {}。
主要特点
1、自动与视图生命周期绑定
视图消失时,SwiftUI 会自动取消 .task 内的任务(类似 Task.cancel()),避免内存泄漏或无效操作。
2、支持 async/await
.task 内可以直接调用 async 函数,并使用 await 暂停 Task。
3、可以与标识符绑定
.task(id: userId) {
// 当 userId 变化时,任务会自动重新执行
await loadUserData(for: userId)
}
注意事项
.task 是 视图级别的异步操作,不同于全局 Task {}。
如果视图多次刷新(如状态变化触发 body 重建),.task 会重新运行。可以通过 id: 控制是否重新执行。
如果希望在视图消失时取消任务,.task 会自动处理。若使用全局 Task {},需要手动管理取消逻辑。
总结
task 是 SwiftUI 中的一个修饰符,专门用于启动异步任务。它的特点是会在视图加载时自动触发,并在异步任务完成后更新视图。task 常用于需要在视图首次加载时执行网络请求、数据加载或其他需要异步处理的操作。
相关文章
1、Swift Concurrency并发:https://fangjunyu.com/2025/05/15/swift-concurrency%e5%b9%b6%e5%8f%91/
2、Swift并发模型中的Task:https://fangjunyu.com/2025/05/15/swift%e5%b9%b6%e5%8f%91%e6%a8%a1%e5%9e%8b%e4%b8%ad%e7%9a%84task/
3、Swift并发模型中的Task.result属性:https://fangjunyu.com/2024/12/09/swift%e5%b9%b6%e5%8f%91%e6%a8%a1%e5%9e%8b%e4%b8%ad%e7%9a%84task-result%e5%b1%9e%e6%80%a7/
4、Swift并发模型中的TaskGroup和async let:https://fangjunyu.com/2025/05/15/swift%e5%b9%b6%e5%8f%91%e6%a8%a1%e5%9e%8b%e4%b8%ad%e7%9a%84taskgroup%e5%92%8casync-let/
5、Swift并发模型主actor(MainActor): https://fangjunyu.com/2024/12/25/swift%e4%b8%bb%e7%ba%bf%e7%a8%8b%e6%a0%87%e8%ae%b0mainactor/
6、Swift并发模型中的Actor:https://fangjunyu.com/2024/10/22/swift%e7%a7%91%e6%99%ae%e6%96%87%e3%80%8aactor-%e9%9a%94%e7%a6%bb%e3%80%8b/
