我有一个函数 doEverything
需要一个完成 block 。它调用另外两个函数,doAlpha
和 doBeta
,它们都有完成 block 。这两个函数应该异步运行。我想在其他两个函数都调用了它们的完成 block 之后调用 doEverything
的完成 block 。
目前,它看起来像这样:
func doEverything(completion: @escaping (success) -> ())) {
var alphaSuccess = false
var betaSuccess = false
doAlpha { success in
alphaSuccess = success
}
doBeta { success in
betaSuccess = success
}
// We need to wait here
completion(alphaSuccess && betaSuccess)
}
doAlpha
和 doBeta
应该同时运行,一旦它们都完成,完成 block 应该用 alpha 和 beta 的结果调用。
我已经阅读了调度组和障碍,但我不确定哪个最合适,它们如何引入新范围(关于我正在使用的两个变量)以及我应该如何实现它。
非常感谢。
最佳答案
Grand Central Dispatch (GCD) 是您在这里尝试做的事情的一个很好的选择,您可以通过使用 DispatchQueue 来实现。和 DispatchGroup ,如下:
swift 3:
func doEverything(completion: @escaping () -> ()) {
let queue = DispatchQueue(label: "reverseDomain", attributes: .concurrent, target: .main)
let group = DispatchGroup()
group.enter()
queue.async (group: group) {
print("do alpha")
group.leave()
}
group.enter()
queue.async (group: group) {
print("do beta")
group.leave()
}
group.notify(queue: DispatchQueue.main) {
completion()
}
}
或者,您可以通过这种方式实现它(我发现这种方式更具可读性):
func doEverything(completion: @escaping () -> ()) {
let queue = DispatchQueue(label: "reverseDomain", attributes: .concurrent, target: .main)
let group = DispatchGroup()
queue.async (group: group) {
print("do alpha")
}
queue.async (group: group) {
print("do beta")
}
group.notify(queue: DispatchQueue.main) {
completion()
}
}
请注意,我从 completion
闭包中删除了 success
标志。
在这种情况下,“do beta”(第二个 queue.async
的执行)将不会执行,直到“do alpha”(第一个 queue.async 的执行)
) 完成,那是因为 queue
目标是 .main
。如果你想让 queue.async
同时工作,不需要创建额外的队列,同一个队列应该可以完成工作,通过替换:
let queue = DispatchQueue(label: "reverseDomain", attributes: .concurrent, target: .main)
与:
let queue = DispatchQueue(label: "reverseDomain", attributes: .concurrent)
现在,系统将控制这两个 queue.async
任务应该如何同时工作(显然,group.notify
将在任务拖后执行完成)。
希望这对您有所帮助。
关于swift - 当调用了另外两个完成 block 时调用完成 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41809000/