是否有可能不将函数声明为异步,并且仍然在其中运行异步操作,这将使用完成处理程序返回值?



我目前正在重写很多代码来使用新的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)
}
}
}