Swfit Asynic await Task

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 方法的结果,只有在结果到达后才继续。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容