是否可以不将函数声明为异步并且仍然 运行 其中的异步操作将 return 值使用完成处理程序?

Is it possible to not declare function as async and still run an async operation in it which will return value using a completion handler?

我目前正在重写大量代码以使用新的 async/await 机制,但我想逐个进行,而不是更改项目中的每个文件以使用 async/await .

我将如何转换使用完成处理程序的方法,如下所示:

func fetchLibrary(completion: ((Error?) -> Void)?) {
    apiManager.loadLibraryContent { [weak self] result in
        switch result {
        case .success(let records):
            let databaseError = self?.databaseManager.updateDatabase(withNewRecords: records)
            completion?(databaseError)
        case .failure(let error):
            completion?(error)
        }
    }
}

然后将 apiManagerloadLibraryContent 方法更新为如下所示:

func loadLibraryContent() async throws -> [GRDBRecord] {

并且仍然可以在第一个方法中使用完成处理程序?这将使逐步迁移到 async/await 变得更加容易。

理想情况下,新代码应如下所示:

func fetchLibrary(completion: ((Error?) -> Void)?) {
    do {
        let records = try await apiManager.loadLibraryContent()
        let databaseError = self?.databaseManager.updateDatabase(withNewRecords: records)
        completion?(databaseError)
    } catch {
        completion?(error)
    }
}

是否可以在 Swift 中完成?

您可以使用Task

    func fetchLibrary(completion: ((Error?) -> Void)?) {
        Task {
            do {
                let records = try await apiManager.loadLibraryContent()
                let databaseError = self?.databaseManager.updateDatabase(withNewRecords: records)
                completion?(databaseError)
            } catch {
                completion?(error)
            }
        }
    }