[英]DispatchGroup with async functions in a Firebase Realtime DB observe method in Swift
[英]Error in handling a series of async functions using dispatchGroup in Swift
我有一个项目,其中包含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
封装在相应的异步函数中:
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:)
引起的。 您的调度小组甚至在开始之前就结束了;)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.