[英]Async/await equivalent of saving a completion block of a method
我在NetworkManager
class 中有一个 function ,它加载一个 object Bar
并将其返回到完成块中。 如果我的应用程序在后台,我将完成块保存在 class FooManager
中,如下所示:
func getBar(
withRequestId requestId: String,
completion: (Bar) -> Void
) {
let applicationState = UIApplication.shared.applicationState
if applicationState == .background {
let request = BarRequest(
id: requestId,
completion: completion
)
fooManager.request = request
return
}
...
}
然后,在FooManager
中,当收到applicationDidBecomeActive
通知时,我再次调用 function 并传入完成处理程序,以便原始请求可以完成并返回给调用者:
func applicationDidBecomeActive() {
guard let request else {
return
}
network.getBar(
withRequestId: request.id,
completion: request.completion
)
self.request = nil
}
这很好用。 但是,我现在正在将此 function 转换为异步,但我不知道如何在没有完成块保存的情况下执行此操作。
func getBar(withRequestId requestId: String,) async throws -> Config {
let applicationState = UIApplication.shared.applicationState
if applicationState == .background {
let configRequest = ConfigRequest(
id: requestId,
completion: completion // Can't do this now
)
configManager.configRequest = configRequest
return
}
...
}
我该怎么做,或者与此等效的事情?
我收集到getBar
有时对闭包没有任何作用,而是将其隐藏起来以备将来使用,有时可能会调用它。 如果是这样,那根本不会很好地重构为async
function。
与async
函数的约定是它们将始终返回值或抛出(尽管,鉴于您的闭包没有闭包的错误参数,看来这不应该是throws
的 function )。 此外,在async
方法完成后运行的代码不会作为参数传递,而是返回到调用者的“延续”中,即await
“暂停”点之后的那段代码。 您不能将此延续保存在属性中,以便稍后调用。
所以,如果你真的需要这种“保存这段代码以便我以后调用它”的模式,你可能只想保留闭包参数。 仅仅因为您有一个具有闭包参数的方法并不意味着您必须使其成为async
。 async
- await
的重点是捕获异步任务之间的明确依赖关系,但如果您需要保存一段代码以在其他时间点调用,那么闭包可能是最好的模式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.