I understand how to use a dispatch group in a simple for-loop. I, however, have a more complicated for-loop with more asynchronous calls within it. I want all the asynchronous calls to complete before executing the group completion code. I have tried to apply the principles in this answer to no avail- Can I use dispatch group not in a loop?. Here is my code, based off of the techniques I observed in that link:
let group = DispatchGroup()
for ref in self.notifsRefList {
group.enter()
self.db.fetch(withRecordID: ref.recordID) { notifRecord, notifErr in
print("async call")
if notifErr == nil {
// do stuff
if let ref = notifRecord?.object(forKey: POST) as! CKReference? {
group.enter()
self.db.fetch(withRecordID: ref.recordID) { postRecord, err in
print("async call")
if err == nil {
// do stuff
group.leave()
}
else {
print("\(err)")
group.leave()
}
}
}
if let ref = notifRecord?.object(forKey: USER_NOTIF) as! CKReference? {
self.db.fetch(withRecordID: ref.recordID) { userRecord, err2 in
group.enter()
print("async call")
if err2 == nil {
// do stuff
group.leave()
}
else {
print("\(err2)")
group.leave()
}
}
}
if let ref = notifRecord?.object(forKey: LIBRARY_ITEM) as! CKReference? {
self.db.fetch(withRecordID: ref.recordID) { libRecord, err3 in
group.enter()
print("async call")
if err3 == nil {
// do stuff
group.leave()
}
else {
print("\(err3)")
group.leave()
}
}
}
group.leave()
}
else {
print("\(notifErr)")
group.leave()
}
}
}
group.notify(queue: .main, execute: { // executed after all async calls in for loop finish
print("done with all async calls")
// do stuff
})
From the print statements I included, I know that my asynchronous calls are incorrect: sometimes "done with all async calls" prints before all instances of "async call." Any help in how to get this dispatch group working properly would be much appreciated. Thanks!