SwiftUI中的.task修改器

147 阅读2分钟

前言

使用.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还有另外两个参数可以对任务进行配置

  1. priority指定任务的优先级,默认是.userInitiated最高优先级。而如果我们并不需要那么高优先级时,可以根据需要自己设置。下面的代码把任务放在了很低的优先级上运行

MyView() .task(priority: .background) { }

  1. 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消失、变化的时候我们需要自己处理任务的状态,很麻烦

资料

alexanderweiss.dev/blog/2023-0…