在Swift中使用dispatchGroup处理一系列异步函数时出错
问题描述:
我有一个包含2组异步函数的项目,它们应该按顺序执行。在执行完所有异步函数之后,我试图运行function3
。在Swift中使用dispatchGroup处理一系列异步函数时出错
这里是我的代码高层结构:
class VC: UIViewController {
let dispatchGroup = DispatchGroup()
let dispatchGroup2 = DispatchGroup()
override func viewDidLoad() {
asyncFunc1()
dispatchGroup.notify(queue: .main) {
asyncFunc2()
}
dispatchGroup2.notify(queue: .main) {
print("all done")
function3()
}
}
func asyncFunc1() {
for item in itemArray {
dispatchGroup.enter()
Alamofire.request(urlString).responseString { response in
dispatchGroup.leave()
}
}
}
func asyncFunc2() {
for item in itemArray2 {
dispatchGroup2.enter()
Alamofire.request(urlString).responseString { response in
dispatchGroup2.leave()
}
}
}
}
我的期望是,功能的asyncFunc1() -> asyncFunc2() -> function3()
顺序运行。 当我真的运行这个应用程序时,我看到dispatchGroup2.notify
是在程序运行开始时触发的,并且在asyncFunc2
完成后从未被调用。这里有什么问题?我尝试过使用一个dispatchGroup
变量,而不是2(dispatchGroup
和dispatchGroup2
),但这不再工作。
答
我建议一个简单的重构来包封那些DispatchGroup
s相应异步函数内:
func asyncFunc(completion: @escaping() -> Void) {
let dispatchGroup = DispatchGroup()
for ... {
dispatchGroup.enter()
request ... {
dispatchGroup.leave()
}
}
dispatchGroup.notify(queue: .main) {
completion() // Async function completed!
}
}
这将导致一个非常好的/紧凑顶层溶液:
asyncFunc1 {
self.asyncFunc2 {
print("all done")
self.function3()
}
}
最初的bug。您的原始问题是由于在对应的enter()
方法之前致电notify(queue:)
造成的。你的派遣小组甚至在它开始之前已经结束了;)
工程就像一个魅力!非常感谢您指出我的错误并提出新的答案。我希望我可以多次注册这个游戏;) – user7418039