在上一节中,我们讨论了网络请求中的 JSON
解析。这一节将重点关注网络请求的错误处理。无论是从服务器返回的错误,还是网络连接本身的问题,处理这些错误对于提升用户体验和应用的稳定性都是至关重要的。
1. 网络请求的错误类型 在进行网络请求时,可能会遇到各种错误,主要可以分为以下几种类型:
网络连接错误 :如无网络、超时等。
HTTP错误 :如404(未找到)、500(服务器内部错误)等。
数据解析错误 :如服务器返回的 JSON
格式不正确。
请求取消 :用户可能在请求完成前取消了操作。
理解这些错误类型对于设计合理的错误处理逻辑非常关键。
2. 处理网络请求错误 我们通常会将网络请求放在一个 do-catch
块中,以捕获可能抛出的错误。下面是一个简单的使用 URLSession
进行网络请求的示例,并包含错误处理逻辑。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 import UIKitenum NetworkError : Error { case noConnection case badResponse case dataNotFound } func fetchData (from url : String , completion : @escaping (Result <Data , NetworkError >) -> Void ) { guard let url = URL (string: url) else { completion(.failure(.dataNotFound)) return } let task = URLSession .shared.dataTask(with: url) { data, response, error in if let error = error { print ("网络请求错误: \(error.localizedDescription) " ) completion(.failure(.noConnection)) return } guard let httpResponse = response as? HTTPURLResponse else { completion(.failure(.badResponse)) return } guard (200 ... 299 ).contains(httpResponse.statusCode) else { print ("请求错误: \(httpResponse.statusCode) " ) completion(.failure(.badResponse)) return } guard let data = data else { completion(.failure(.dataNotFound)) return } completion(.success(data)) } task.resume() }
在上述代码中,我们定义了一个 fetchData
函数来发起网络请求,并使用了 Result
来处理成功和失败的情况。在错误处理方面,我们分别检查了网络连接错误、HTTP响应状态以及数据的有效性。
3. 错误处理示例 为了更直观地理解错误处理,下面是一个完整的案例,假设我们要从一个 API
获取用户信息,并处理可能发生的错误。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 fetchData(from: "https://api.example.com/user" ) { result in switch result { case .success(let data): print ("成功获取数据: \(data) " ) case .failure(let error): switch error { case .noConnection: print ("请检查您的网络连接。" ) case .badResponse: print ("服务器返回错误,请稍后再试。" ) case .dataNotFound: print ("未能找到数据。" ) } } }
在这个案例中,根据不同的错误类型,我们在主线程上进行相应的提示处理。这可以帮助用户了解到当前的问题,并给出相应的解决方法。
4. 用户界面反馈 在实际应用中,我们还需要将错误信息展示给用户,以便他们能够理解发生了什么。可以使用 UIAlertController
显示错误提示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 func showErrorAlert (for error : NetworkError ) { var message: String switch error { case .noConnection: message = "请检查您的网络连接。" case .badResponse: message = "服务器返回错误,请稍后再试。" case .dataNotFound: message = "未能找到数据。" } let alert = UIAlertController (title: "错误" , message: message, preferredStyle: .alert) alert.addAction(UIAlertAction (title: "确定" , style: .default, handler: nil )) DispatchQueue .main.async { if let topController = UIApplication .shared.keyWindow? .rootViewController { topController.present(alert, animated: true , completion: nil ) } } }
在这个 showErrorAlert
函数中,我们接收 NetworkError
,并创建相应的 UIAlertController
来向用户展示错误信息。
结语 通过对网络请求错误的处理,我们能够提升应用的用户体验,让用户更好地理解发生了什么,以及需要如何处理。这一节为后面的持久化数据做准备,能够在数据请求失败时通过本地缓存的数据来提高容错率。在下一节中,我们将深入探讨 Core Data
的基本使用,继续构建我们的 iOS 应用。