如何在 SwiftUI 中使用 .onChange 调用异步函数?

1 asynchronous onchange task async-await swiftui

在 SwiftUI 中,我尝试使用 .onChange 调用异步函数(用于加载 ImagePicker 选取的图像)。我收到“在不支持并发的函数中调用‘异步’”错误。如果我进行功能同步并删除“Task {@MainActor in”部分,那么它会运行,但在加载图像期间会出现一些我不想要的紫色错误。

是否可以使用 .onChange 来调用异步函数?

func loadImage() async {
    Task { @MainActor in
        guard let inputImage = inputImage else {
            loadingState = .failed
            return
        }
        jpegData = inputImage.jpegData(compressionQuality: 0.8)!
        image = Image(uiImage: inputImage)
        loadingState = .loaded
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试按如下方式调用该函数;

.onChange (of: addPersonViewModel.inputImage, perform: { _ in addPersonViewModel.loadImage() })
Run Code Online (Sandbox Code Playgroud)

如果我进行功能同步并删除“Task {@MainActor in”部分,那么它会运行,但在加载图像期间会出现一些我不想要的紫色错误。

lor*_*sum 5

代替

.onChange (of: addPersonViewModel.inputImage, perform: { _ in addPersonViewModel.loadImage() })
Run Code Online (Sandbox Code Playgroud)

使用

.task(id:addPersonViewModel.inputImage){
 await addPersonViewModel.loadImage() }
Run Code Online (Sandbox Code Playgroud)

您必须对您的功能进行轻微修改

func loadImage() async {

    guard let inputImage = inputImage else {
        loadingState = .failed
        return
    }
    jpegData = inputImage.jpegData(compressionQuality: 0.8)!
    image = Image(uiImage: inputImage)
    loadingState = .loaded

}
Run Code Online (Sandbox Code Playgroud)

Task在函数内部浮动并不是一个好的做法。