Skip to content

在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的强大功能,提升你的开发技能吧!🚀

本站使用 VitePress 制作