您现在的位置是:首页 >技术交流 >SwiftUI中Task await async组合使用调用异步函数网站首页技术交流
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,可以编写更加简洁、易读和可维护的异步代码。