是否可以不将函数声明为异步并且仍然 运行 其中的异步操作将 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)
}
}
}
然后将 apiManager
的 loadLibraryContent
方法更新为如下所示:
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)
}
}
}
我目前正在重写大量代码以使用新的 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)
}
}
}
然后将 apiManager
的 loadLibraryContent
方法更新为如下所示:
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)
}
}
}