前言
使用.task
修改器,你可以SwiftUI中启动一个异步执行的task。该task可以使用Swift的async、await
等更现代的异步语法
基本使用
我们可以在.task
中执行View出现在屏幕上时需要做的任务
struct ContentView: View {
var body: some View {
Text("Hello World")
.task {
// Execute some async task
}
}
}
高级用法
.task
还有另外两个参数可以对任务进行配置
priority
指定任务的优先级,默认是.userInitiated
最高优先级。而如果我们并不需要那么高优先级时,可以根据需要自己设置。下面的代码把任务放在了很低的优先级上运行
MyView() .task(priority: .background) { }
id
给任务指定id。只要id改变,之前的任务会被取消并以新的id创建任务
struct IceCreamDetailView: View {
let iceCream: IceCream
let detailData: IceCreamDetails
var body: some View {
Text(iceCream.name)
.task(id: iceCream) {
// Fetch IceCream Details
}
}
}
这在使用了NavigationSplitView
的程序尤其有用。这样我们每次点击后,selectedIceCream会发生变化,detail内之前的task就会被取消,而不是每次都发送请求
struct IceCreamSplitView: View {
// MARK: - State Properties
@State var iceCreams: [IceCream]
@State private var selectedIceCream: IceCream?
// MARK: - Body
var body: some View {
NavigationSplitView {
List(selection: $selectedSite) {
ForEach(iceCreams) { iceCream in
Text(iceCream.name)
}
}
.navigationTitle("IceCreams")
} detail: {
if let iceCream = selectedIceCream {
NavigationStack {
IceCreamDetailView(iceCream: iceCream)
}
} else {
Text("Please select an ice cream")
}
}
}
}
.task
和 .onAppear
有什么区别?
.task
是在View出现时执行一个任务,.onAppear
也是在每次View出现时执行回调,他们功能很类似,但是有什么区别呢?
使用.task
有两个优势
1..task
闭包本身就是一个Task,可以直接在函数体内使用async、await
,而不用再包一层Task。而要想在.onAppear
中执行异步任务需要我们把任务包装到Task中
2. .task
有任务的取消机制,我们不需要关心任务的生命周期。而如果我们使用.onAppear
的话,View消失、变化的时候我们需要自己处理任务的状态,很麻烦