我有一个包含 2 组异步函数的项目,它们应该按顺序执行。执行所有异步函数后,我尝试运行 function3
。
这是我的代码的高级结构:
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()
}
}
初始错误。您最初的问题是由于在相应的 enter()
方法之前调用 notify(queue:)
引起的。你的 dispatch 组还没开始就结束了 ;)
关于ios - 在 Swift 中使用 dispatchGroup 处理一系列异步函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46995362/