![](/img/trans.png)
[英]How do I refactor the code for making the API call using async await in swift
[英]How to refactor Swift API call to use Swift 5.5 async/await?
我想重構一些 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
等。
有誰知道新的函數體應該是什么樣的?
謝謝
func getBooks() async throws -> [Book] {
let (data, _) = try await URLSession.shared.data(for: request)
return try JSONDecoder().decode([Book].self, from: data)
}
如果請求失敗,並且響應無法解碼,這將拋出。 由於該函數被標記為拋出,因此調用函數必須處理引發的錯誤。
你不需要將返回的[Book]
聲明為可選的,因為它要么返回一個誠實的數組,要么拋出一個錯誤。
在您的附加代碼中,您必須在主隊列上調用完成處理程序,因為您是從請求的完成塊中調用它的。 你不需要在這里這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.