2017-06-11 3 views
0

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

Antwort

0

Versuchen Sie schreiben Code unten nach Beendigung der Schleife in myGroup.notify zu helfen (Warteschlange: .main) -Methode.

self.mapView?.showAnnotations((self.mapView?.annotations)!, animated: true) 
+0

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

Verwandte Themen