gpt4 book ai didi

swift - 当调用了另外两个完成 block 时调用完成 block

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

我有一个函数 doEverything 需要一个完成 block 。它调用另外两个函数,doAlphadoBeta,它们都有完成 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)
}

doAlphadoBeta 应该同时运行,一旦它们都完成,完成 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/

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