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