Skip to content

12.5 使用async_await重构URLSession请求

Async/await 是 Swift 中处理异步操作的一种现代且强大的方式。它使异步代码看起来和行为更像同步代码,从而大大提高了代码的可读性和可维护性。让我们一起看看如何使用 async/await 来重构 URLSession 请求,让你的网络代码更加简洁高效!🚀

传统的回调方式

在 async/await 出现之前,我们通常使用闭包来处理 URLSession 的异步回调。这种方式虽然可行,但容易导致“回调地狱”,代码嵌套层次过深,难以理解和维护。

swift
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 请求。首先,我们需要创建一个异步函数来执行网络请求。

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,
          httpResponse.statusCode == 200 else {
        throw URLError(.badServerResponse)
    }
    
    return data
}

在这个函数中,async 关键字表示这是一个异步函数,await 关键字用于等待 URLSession.shared.data(from: url) 完成。如果请求失败,我们可以使用 throw 抛出错误。

使用重构后的函数

接下来,我们可以在其他异步函数或任务中使用这个重构后的函数。

swift
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 块来捕获和处理异步操作中的错误。例如:

swift
do {
    let data = try await fetchData(from: url)
    // 处理数据
} catch URLError.badServerResponse {
    print("服务器响应错误")
} catch {
    print("其他错误: \(error.localizedDescription)")
}

总结

通过使用 async/await,你可以显著提高 URLSession 请求代码的可读性和可维护性。它简化了异步编程,并使错误处理更加直观。现在就开始尝试使用 async/await 重构你的网络代码吧!🎉

本站使用 VitePress 制作