【发布时间】:2021-10-02 12:30:22
【问题描述】:
我想重构一些 API 调用以在我的 SwiftUI 项目中使用 Swift 5.5 的新 async/await。但是,我不清楚如何替换或容纳完成。
这是我要重构的示例函数:
static func getBooks(completion: @escaping ([Book]?) -> Void) {
let request = getRequest(suffix: "books")
URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
fatalError("Error: \(error)")
}
if let data = data {
if let books = try? JSONDecoder().decode([Book].self, from: data) {
DispatchQueue.main.async {
print("books.count: \(books.count)")
completion(books)
}
return
} else {
fatalError("Unable to decode JSON")
}
} else {
fatalError("Data is nil")
}
}.resume()
}
我相信新的函数签名应该是这样的:
static func getBooks() async throws -> ([Book]?) {
// ...
}
但是,我不知道如何处理 URLSession.shared.dataTask、DispatchQueue.main.async 和 completion 等。
有人知道新的函数体应该是什么样子吗?
谢谢
【问题讨论】:
-
Meet async await 大约 26:59 分
-
通过WWDC 2021 – Swift concurrency: Update a sample app观看。这是一整小时的代码视频,带您逐步了解如何逐步迁移应用程序的各个部分。他们选择替换的部件对他们来说有各种各样的真实世界模式,所以这是一个非常棒/适用的视频。
标签: swift macos async-await swiftui