簡體   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