gpt4 book ai didi

ios - 将完成处理程序汇集在一起​​,以便一旦执行多个闭包,方法就完成

转载 作者:行者123 更新时间:2023-12-01 17:24:37 25 4
gpt4 key购买 nike

我有一种情况,我想并行执行三个不同的异步任务。一旦完成所有三个任务,我便希望调用方法意识到这一点并调用它自己的完成处理程序。

以下是此逻辑的非常简化的版本:

class ViewController: UIViewController {
func doTasks(with object: Object, completionHandler: () -> Void) {
// Once A, B & C are done, then perform a task
wrapupTask()
// When task is complete, call completionHandler
completionHandler()
}
}

fileprivate extension ViewController {
func taskA(with object: Object, completionHandler: () -> Void) {
// Do something

completionHandler()
}

func taskB(with object: Object, completionHandler: () -> Void) {
// Do something

completionHandler()
}

func taskC(with object: Object, completionHandler: () -> Void) {
// Do something

completionHandler()
}
}

我可以轻松地将处理程序链接在一起,但是任务可能会花费更长的时间,并且代码会很烂。

我考虑的另一个项目是一个简单的计数器,该计数器在每次任务完成时都会递增,然后一旦达到3,便会通过如下方式调用wrapupTask():
var count: Int {
didSet {
if count == 3 {
wrapupTask()
}
}
}

我考虑过的另一种选择是创建一个操作队列,然后将任务加载到其中,并依赖于何时运行包装任务。队列为空后,它将调用完成处理程序。但是,这似乎比我想要完成的工作要多。

我的希望是,我只是想念一些更好的东西。

最佳答案

只是为了了解OOPer所说的,您正在寻找DispatchGroup。在下面,对taskAtaskBtaskC的调用是伪代码,但其他所有操作都是真实的:

func doTasks(with object: Object, completionHandler: () -> Void) {
let group = DispatchGroup()
group.enter()
taskA() {
// completion handler
group.leave()
}
group.enter()
taskB() {
// completion handler
group.leave()
}
group.enter()
taskC() {
// completion handler
group.leave()
}
group.notify(queue: DispatchQueue.main) {
// this won't happen until all three tasks have finished their completion handlers
completionHandler()
}
}

在异步完成处理程序的末尾,每个 enter都由一个 leave进行匹配,只有当所有匹配项都已实际执行后,我们才进入 notify完成处理程序。

关于ios - 将完成处理程序汇集在一起​​,以便一旦执行多个闭包,方法就完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41412780/

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