I'm having trouble waiting for an asynchronous call and then populating the resulting addresses into placemarks for an MKMapView.
The issue is that only one placemark ends up showing on the map's view. I know the others exist because I've debugged it and seen such in the array. It's just not populating the map view fully/refreshing the MKAnnotation's assigned to it.
// Load user sales
myFirebaseController.loadSales(){(result: [SaleModel]) in
// Assign result
self.salesList = result
let geocoder = CLGeocoder()
let myGroup = DispatchGroup()
// For each sale loaded in
for sale in self.salesList{
myGroup.enter()
// Decode the address into coordinates
geocoder.geocodeAddressString(sale.saleAddress!, completionHandler: {(placemarks, error) -> Void in
if((error) != nil){
print("Error", error!)
}
if let placemark = placemarks?.first {
// Set the coordinate
let coordinates:CLLocationCoordinate2D = placemark.location!.coordinate
// Add the annotation
self.createMapAnnotation(coordinate: coordinates, title: sale.saleTitle!, address: sale.saleAddress!)
}
myGroup.leave()
})
}
myGroup.notify(queue: .main){
for annotation in self.mapView.annotations {
self.mapView.removeAnnotation(annotation)
self.mapView.addAnnotation(annotation)
}
}
}
As you can see once the dispatch group is left, I try to remove all annotations and re-add them, as a means to refresh it, though I think this is a poor attempt and obviously it doesn't change the map view (which only records the first sale annotation of the self.salesList)
What am I doing wrong here?
Note:self.createMapAnnotation() adds an annotation to the map view.
EDIT: I tried following this - Wait until swift for loop with asynchronous network requests finishes executing but it doesn't seem to help my situation