Skip to content

14.4_处理并向UI层报告网络错误

在你的 iOS 应用中,处理网络错误并将其清晰地报告给 UI 层至关重要。这不仅能提升用户体验,还能帮助你快速定位和解决问题。让我们一起看看如何优雅地实现这一目标!🚀

定义错误类型

首先,你需要定义一套清晰的网络错误类型。这能帮助你更好地识别和处理不同类型的错误。你可以使用 enum 来定义这些错误类型。

swift
enum NetworkError: Error {
    case invalidURL
    case requestFailed(Error)
    case invalidResponse
    case invalidData
    case decodingError(Error)
}
  • invalidURL: URL 无效。
  • requestFailed: 请求失败,包含具体的错误信息。
  • invalidResponse: 响应无效。
  • invalidData: 数据无效。
  • decodingError: 解码失败,包含具体的错误信息。

在 ViewModel 中处理错误

在 ViewModel 中,你需要捕获网络请求中可能出现的错误,并将它们转换成 UI 层可以理解的形式。你可以使用 Result 类型来封装网络请求的结果。

swift
func fetchData(completion: @escaping (Result<Data, NetworkError>) -> Void) {
    guard let url = URL(string: "https://example.com/api/data") else {
        completion(.failure(.invalidURL))
        return
    }

    URLSession.shared.dataTask(with: url) { data, response, error in
        if let error = error {
            completion(.failure(.requestFailed(error)))
            return
        }

        guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) else {
            completion(.failure(.invalidResponse))
            return
        }

        guard let data = data else {
            completion(.failure(.invalidData))
            return
        }

        completion(.success(data))
    }.resume()
}

将错误报告给 UI 层

接下来,你需要将 ViewModel 中处理的错误报告给 UI 层。你可以使用闭包或者 RxSwift/Combine 等响应式编程框架来实现。这里我们使用闭包作为例子。

swift
func fetchData(completion: @escaping (Result<Data, NetworkError>) -> Void) {
    // ... (网络请求代码) ...

    URLSession.shared.dataTask(with: url) { data, response, error in
        // ... (错误处理代码) ...

        completion(.success(data))
    }.resume()
}

// 在 ViewController 中调用
viewModel.fetchData { result in
    switch result {
    case .success(let data):
        // 处理成功的数据
        print("数据获取成功:\(data)")
    case .failure(let error):
        // 显示错误信息
        print("数据获取失败:\(error)")
        self.showAlert(with: error)
    }
}

在 UI 层显示错误信息

最后,你需要在 UI 层显示错误信息。你可以使用 UIAlertController 来显示一个简单的错误提示框。

swift
func showAlert(with error: NetworkError) {
    let alert = UIAlertController(title: "错误", message: error.localizedDescription, preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "确定", style: .default, handler: nil))
    present(alert, animated: true, completion: nil)
}

通过以上步骤,你就可以在 iOS 应用中优雅地处理网络错误,并将错误信息清晰地报告给 UI 层啦!🎉 记住,良好的错误处理是提升用户体验的关键!

本站使用 VitePress 制作