![](/img/trans.png)
[英]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.