Чтобы понять, как он работает и как его использовать, попробуйте сначала упростить свой код, а затем расширить его со всей своей функциональностью.
давайте посмотрим на эту часть вашего кода
for result in results {
myGroup.enter() // ENTER GROUP
let donationCenter = DonationCenter(name: text, image: image, latitude: location["lat"] as! Double, longitude: location["lng"] as! Double, phone: formattedPhoneNumber, website: website)
donationCenters.append(donationCenter)
myGroup.leave() // LEAVE GROUP
}
, поскольку там есть только код синхронизации, он эквивалентен
for result in results {
myGroup.enter()
myGroup.leave()
}
и, наконец,
for result in results {}
Как видите, ваша группа там не имеет никакой функциональности!
откройте игровую площадку и попытайтесь понять, как использовать DispatchGroup для ваших требований (чтобы быть в курсе, когда все задние задания выполнены)
import Foundation
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
// it mimics some function which do some job in the background
// as dataTask in your example
func asyncFoo(id: Int, completition: @escaping (_ result: String)->()) {
let q = DispatchQueue(label: "internal", qos: .background, attributes: .concurrent)
q.async {
// running in the backgroud
var sum = 0
for i in 1...1000 {
let r = Int.random(in: 0..<i)
sum += r
}
let res = sum.description
completition(res)
}
}
let group = DispatchGroup()
for i in 0..<10 {
group.enter() // enter the group before the task starts
asyncFoo(id: i) { (result) in
print("id:", i, result)
group.leave() // leave the group when task finished
}
}
group.notify(queue: .main) {
print("all done")
PlaygroundPage.current.finishExecution()
}
print("continue execution ...")
она печатает что-то вроде
continue execution ...
id: 4 260320
id: 2 252045
id: 8 249323
id: 3 265640
id: 0 256478
id: 1 253038
id: 5 252521
id: 9 255435
id: 6 245125
id: 7 252262
all done