繁体   English   中英

Async/await 相当于保存方法的完成块

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM