所有异步功能都完成后,我需要能够调用完成块。但是,它们并不都具有完成块。这是我的代码:
func pauseStream(completion: @escaping () -> ()) {
disconnectFromSession()
model.publishers = []
model.pauseStream() { result in
}
}
disconnectFromSession
是一个异步函数,完成后会在委托类中触发一个回调函数didDisconnectFromSession
。
设置model.publishers = []
将Notification
发布到NotificationCenter
上,该类由类接收,然后更新UI。
最后model.pauseStream()
有一个完成块,让我知道它何时完成。
我需要做的是一旦代码的所有异步部分都完成了,我想调用我的completion()
函数的pauseStream
块。最好的方法是什么?不幸的是,我无法将它们全部更改为具有完成块。
答案 0 :(得分:4)
通常将调度组用于此类事情。这里的技巧是,如果您需要等待disconnectFromSession
调用其完成处理程序,则需要让didDisconnectFromSession
调用调度组的leave
。
因此为调度组创建ivar:
let group = DispatchGroup()
当pauseStream
调用因其相应的DispatchGroup
调用而偏移时,让您的enter
使用此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()
...
}