ios - 是否可以不将函数声明为异步并仍然在其中运行异步操作,该操作将使用完成处理程序返回值?
问题描述
我目前正在重写大量代码以使用新的异步/等待机制,但我想逐个进行,而不是更改项目中的每个文件以使用异步/等待。
我将如何转换使用完成处理程序的方法,如下所示:
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)
}
}
}
然后将loadLibraryContent
方法更新apiManager
为如下所示:
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)
}
}
}
推荐阅读
- docker - 无法将 Docker 映像推送到 Artifactory
- php - Google App Engine 作曲家依赖项不更新
- sql - 如何用新数据更新 SQL 中的部分字符串
- python - Python 中的引用赋值 - 为什么值没有改变?
- python - 将值修改为 Python 字典中的特定键
- java - 多值映射
到多值映射 - python - @jwt_required 装饰器不适用于烧瓶端点
- selenium - 有没有办法根据返回的行数设置在 TestContext 上运行的行数
- python-3.x - Pandas to_excel() 将零写入字符串
- docker - Docker –host 通过 SSH ProxyJump