12.5 使用async_await重构URLSession请求
Async/await 是 Swift 中处理异步操作的一种现代且强大的方式。它使异步代码看起来和行为更像同步代码,从而大大提高了代码的可读性和可维护性。让我们一起看看如何使用 async/await 来重构 URLSession 请求,让你的网络代码更加简洁高效!🚀
传统的回调方式
在 async/await 出现之前,我们通常使用闭包来处理 URLSession 的异步回调。这种方式虽然可行,但容易导致“回调地狱”,代码嵌套层次过深,难以理解和维护。
URLSession.shared.dataTask(with: url) { (data, response, error) in
if let error = error {
print("Error: \(error.localizedDescription)")
return
}
guard let data = data else {
print("No data received.")
return
}
do {
let json = try JSONSerialization.jsonObject(with: data, options: [])
print("JSON: \(json)")
} catch {
print("JSON error: \(error.localizedDescription)")
}
}.resume()Async/Await 的优势
Async/await 通过将异步操作转换为顺序执行的代码,极大地简化了异步编程。它使用 async 关键字标记异步函数,并使用 await 关键字等待异步操作完成。
- 提高可读性:代码结构更清晰,易于理解。
- 简化错误处理:可以使用
try-catch块来处理异步操作中的错误。 - 避免回调地狱:减少代码嵌套,提高可维护性。
重构 URLSession 请求
现在,让我们看看如何使用 async/await 重构 URLSession 请求。首先,我们需要创建一个异步函数来执行网络请求。
func fetchData(from url: URL) async throws -> Data {
let (data, response) = try await URLSession.shared.data(from: url)
guard let httpResponse = response as? HTTPURLResponse,
httpResponse.statusCode == 200 else {
throw URLError(.badServerResponse)
}
return data
}在这个函数中,async 关键字表示这是一个异步函数,await 关键字用于等待 URLSession.shared.data(from: url) 完成。如果请求失败,我们可以使用 throw 抛出错误。
使用重构后的函数
接下来,我们可以在其他异步函数或任务中使用这个重构后的函数。
Task {
do {
let url = URL(string: "https://example.com/data")!
let data = try await fetchData(from: url)
let json = try JSONSerialization.jsonObject(with: data, options: [])
print("JSON: \(json)")
} catch {
print("Error: \(error.localizedDescription)")
}
}在这个例子中,我们使用 Task 创建一个并发任务,并在其中调用 fetchData(from: url) 函数。如果 fetchData 函数抛出错误,我们可以使用 catch 块来处理。
错误处理
使用 async/await,错误处理变得更加直观。你可以使用 try-catch 块来捕获和处理异步操作中的错误。例如:
do {
let data = try await fetchData(from: url)
// 处理数据
} catch URLError.badServerResponse {
print("服务器响应错误")
} catch {
print("其他错误: \(error.localizedDescription)")
}总结
通过使用 async/await,你可以显著提高 URLSession 请求代码的可读性和可维护性。它简化了异步编程,并使错误处理更加直观。现在就开始尝试使用 async/await 重构你的网络代码吧!🎉