SwiftUI中Task await async组合使用调用异步函数

最近在新的第三方代码中经常看到SwiftUI使用Task await async这3个关键字组合使用,今天研究了一下.发现可以用于swiftUI界面调用也不方法.3个组合使用.
async: 函数来执行异步任务.
await: 等待任务完成并获取结果。这样可以让异步编程的代码更加简洁和易读。

下面是一个SwiftUI中使用Task async/await 的示例代码:
这个代码的运行结果是点击按钮以后,会读取一个url,这个过程中按钮点击以后让变量isLoading = true被禁用,不能点击. 禁用按钮
Task让界面可以执行异步方法,并且在后台执行
await让代码执行完异步函数fetchData之后继续向下执行,让isLoading = false,可以继续点击按钮


import SwiftUI

struct ContentView: View {
    @State private var isLoading = false
    @State private var data = ""

    var body: some View {
        VStack {
            Text(data)
                .padding()
            Button("Fetch Data") {
                Task {
                /*
                Task作用:在使用 async/await 时,不能在主线程中直接调用异步函数。因为异步函数会阻塞当前线程直到异步任务完成,这可能会导致 UI卡死将异步任务封装在 Task 中,Task 会自动将任务放到后台线程执行
                */
                    isLoading = true
                    let result = await fetchData()
                    data = result
                    isLoading = false
                }
            }
            .disabled(isLoading)
            .padding()
        }
    }

    func fetchData() async -> String {
        let url = URL(string: "https://jsonplaceholder.typicode.com/todos/1")!
        let (data, _) = try! await URLSession.shared.data(from: url)
        return String(data: data, encoding: .utf8)!
    }
}

在 fetchData() 函数中,我们使用了 async 修饰符来定义了一个异步函数。在函数体中,我们使用 await 关键字来等待 URLSession.shared.data(from: url) 函数的完成,并且直接从函数中返回结果。

值得注意的是,在使用 async/await 时,不能在主线程中直接调用异步函数。因为异步函数会阻塞当前线程直到异步任务完成,这可能会导致 UI 停滞不前。因此,我们可以将异步任务封装在 Task 中,Task 会自动将任务放到后台线程执行。

在 SwiftUI 中,可以使用 Task 来创建和管理异步任务。Task 是一个异步任务的概念,用于表示一个需要在后台执行的异步操作。在上面的示例中,我们使用 Task 来管理 fetchData() 异步函数。

当我们点击按钮时,会触发一个闭包,其中使用 Task 包装了 fetchData() 函数。Task 会自动将 fetchData() 函数放到后台线程中执行,以避免在主线程中阻塞 UI。

同时,Task 会在异步任务完成后自动更新视图。在上面的示例中,我们在异步任务开始和结束时分别将 isLoading 状态变量设置为 true 和 false,以便在用户等待数据加载时禁用按钮。

Task 可用于创建和管理异步任务,并自动处理异步任务的生命周期和结果。使用 Task 和 async/await,可以编写更加简洁、易读和可维护的异步代码。

你可能感兴趣的:(SwiftUI,swiftui,task,await,async,异步)