Ich habe Probleme, auf einen asynchronen Anruf zu warten und dann die resultierenden Adressen in Ortsmarkierungen für eine MKMapView
aufzufüllen.MapView basierend auf Geocodierten Adressen aktualisieren, nur ein Pin von vielen Orten zeigt
Das Problem ist, dass nur eine Ortsmarke auf der Kartenansicht angezeigt wird. Ich weiß, dass die anderen existieren, weil ich es debuggte und so in der Anordnung sah. Es füllt die Kartenansicht nicht vollständig aus/aktualisiert die MKAnnotation
, die ihm zugewiesen sind.
// 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)
}
}
}
Wie Sie sehen können, sobald die Versandgruppe verlassen wird, versuche ich, alle Anmerkungen zu entfernen und erneut hinzufügen, sie als Mittel, es zu aktualisieren, obwohl ich denke, das ist ein schlechter Versuch, und es doesn offensichtlich‘ t Ändern Sie die Kartenansicht (die nur die erste sale
Annotation der self.salesList
aufnimmt)
Was mache ich hier falsch?
Hinweis: self.createMapAnnotation()
fügt der Kartenansicht eine Anmerkung hinzu.
EDIT: Ich habe versucht, im Anschluss an diese - Wait until swift for loop with asynchronous network requests finishes executing aber es scheint nicht meine Situation
Hmm, scheint nicht zu funktionieren. Ich denke, das Problem ist, dass 'myGroup.notify (queue: .main)' nur einmal aufgerufen wird und nicht für jeden Geokodenthread – ChewySalmon