gpt4 book ai didi

ios - 如何知道所有异步函数何时完成?

转载 作者:搜寻专家 更新时间:2023-11-01 06:11:48 25 4
gpt4 key购买 nike

我需要能够在所有异步函数完成后调用完成 block 。但是,它们并不都具有完成 block 。这是我的代码:

func pauseStream(completion: @escaping () -> ()) {
disconnectFromSession()
model.publishers = []

model.pauseStream() { result in

}
}

disconnectFromSession是一个异步函数,完成后会触发一个回调函数 didDisconnectFromSession在委托(delegate)类中。

设置model.publishers = []发布 NotificationNotificationCenter由类接收,然后更新 UI。

最后model.pauseStream()有一个完成 block 让我知道它何时完成。

我需要做的是在代码的所有异步部分完成后,我想调用 completion()我的 block pauseStream功能。最好的方法是什么?不幸的是,我无法将它们更改为都具有完成 block 。

最佳答案

对于这类事情,您通常会使用调度组。这里的技巧是,如果您需要等待 disconnectFromSession 调用其完成处理程序,则需要让 didDisconnectFromSession 为调度组调用 leave .

因此为调度组创建ivar:

let group = DispatchGroup()

让你的 pauseStream 使用这个 DispatchGroupenter 调用被它们相应的 leave 偏移时调用它的完成处理程序> 调用:

func pauseStream(completion: @escaping () -> ()) {
group.enter()
disconnectFromSession() // this will call `leave` in its delegate method

model.publishers = []

group.enter()
model.someAsynchronousMethod() { result in
defer { group.leave() }

...
}

group.notify(queue: .main) {
completion()
}
}

并且,您的 didDisconnectFromSession 会调用相应的 leave:

func didDisconnectFromSession(...) {
group.leave()

...
}

关于ios - 如何知道所有异步函数何时完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54812917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com