async-await 是在 WWDC 2021 期间的 Swift 5.5 中的结构化并发变化的一部分。
有了新的 async 方法和 await 语句,我们可以定义方法来进行异步工作,使我们的异步代码更容易阅读。
什么是 async
async 是异步的意思,可以看作是一个明确表示一个方法是执行异步工作的一个属性。
func asyncUserBanReason(_ uid: Int64) async throws -> (reason: String, disable: Int64) {
try await withUnsafeThrowingContinuation { continuation in
var query = Pb_AccountUserInfoQuery()
NetworkService.service(CenterServerApi.userBanReason(pb: query), response: Pb_AccountUserInfoQueryResponse.self).httpSubscribe { data in
continuation.resume(returning: (data.user.reason, data.user.disable))
} onError: { error in
continuation.resume(returning: ("", 0))
}.disposed(by: disposebag)
}
}
asyncUserBanReason 方法被定义为异步且可以抛出异常,这意味着它正在执行一个可失败的异步作业。
async 如何取代完成回调闭包
在如今的Swift版本中,使用完成闭包来定义方法仍然是可行的,但它有一些缺点,async 却刚好可以解决。
- 你必须确保自己在每个可能的退出方法中调用完成闭包。如果不这样做,可能会导致应用程序无休止地等待一个结果。
- 闭包代码比较难阅读。与结构化并发相比,对执行顺序的推理并不那么容易。
- 需要使用弱引用weak references来避免循环引用。
- 实现者需要对结果进行切换以获得结果。无法从实现层面使用
try catch
语句。
await
await 是用于调用异步方法的关键字。你可以把它们(async-await)看作是Swift中最好的朋友,因为一个永远不会离开另一个,你基本上可以这样说:
"Await 正在等待来自他的伙伴async 的回调"
使用 await 关键字,我们告诉我们的程序等待 asyncUserBanReason 方法的结果,只有在结果到达后才继续。