在ViewModel中封装异步网络调用
在SwiftUI中,封装异步网络调用是提升应用性能和用户体验的关键。通过将网络请求逻辑放入ViewModel中,你可以有效地管理数据流和状态。
1. 创建网络请求函数
首先,你需要创建一个函数来执行网络请求。使用URLSession可以轻松实现这一点。以下是一个简单的示例:
swift
func fetchData(from url: URL) async throws -> Data {
let (data, response) = try await URLSession.shared.data(from: url)
guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) else {
throw URLError(.badServerResponse)
}
return data
}2. 在ViewModel中调用网络请求
在ViewModel中,你可以使用@MainActor来确保UI更新在主线程上进行。以下是如何在ViewModel中调用上述网络请求的示例:
swift
@MainActor
class MyViewModel: ObservableObject {
@Published var data: Data?
@Published var errorMessage: String?
@Published var isLoading: Bool = false
func loadData() async {
isLoading = true
do {
let url = URL(string: "https://api.example.com/data")!
data = try await fetchData(from: url)
} catch {
errorMessage = error.localizedDescription
}
isLoading = false
}
}3. 处理加载状态
在UI中,你可以根据isLoading的状态来显示加载指示器。这样可以提升用户体验,确保用户知道数据正在加载。例如:
swift
if viewModel.isLoading {
ProgressView("加载中...")
} else if let errorMessage = viewModel.errorMessage {
Text("错误: \(errorMessage)")
} else if let data = viewModel.data {
// 显示数据
}4. 处理错误信息
在网络请求中,错误处理是至关重要的。你可以通过errorMessage属性来显示错误信息,确保用户能够理解发生了什么。例如:
swift
if let errorMessage = viewModel.errorMessage {
Text("发生错误: \(errorMessage)")
.foregroundColor(.red)
}总结
通过在ViewModel中封装异步网络调用,你可以有效地管理数据请求和状态更新。这种方法不仅提高了代码的可读性,还增强了用户体验。使用async/await语法使得异步代码更加简洁易懂。💡
继续探索SwiftUI的强大功能,提升你的开发技能吧!🚀