簡體   English   中英

如何重構 Swift API 調用以使用 Swift 5.5 async/await?

[英]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.dataTaskDispatchQueue.main.asynccompletion等。

有誰知道新的函數體應該是什么樣的?

謝謝

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM