2016-11-24 2 views
0

Ich versuche, zwei Anmerkungen in MapView anzuzeigen.Warum wird MKPointAnnotation nicht angezeigt?

Warum wird die zweite Annotation in MapView nicht angezeigt? Ich habe versucht, Ortsmarkierungen [0] zu ändern, um Markierungen [1] zu setzen, aber ohne Hilfe.

Ich hätte für Klausel verwendet werden können, aber zum Testen wiederholte ich den Code.

class Asiakas { 
    var nimi = "" 
    var osoite = "" 

    init(nimi: String, osoite: String) { 
     self.nimi = nimi 
     self.osoite = osoite 
    } 
} 


class ViewController: UIViewController { 

    @IBOutlet weak var mapView: MKMapView! 

    var asiakkaat:[Asiakas] = [ 
     Asiakas(nimi: "Testi Asiakas", osoite: "Museokatu 10, helsinki"), 
     Asiakas(nimi: "Hyvä asiakas", osoite: "Pihlajatie 17, helsinki") 
    ] 

    var asiakas:Asiakas! 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     let geoCoder = CLGeocoder() 

     geoCoder.geocodeAddressString(asiakkaat[0].osoite, completionHandler: { placemarks, error in 
      if error != nil { 
       print(error) 
       return 
      } 

      if let placemarks = placemarks { 
       let placemark = placemarks[0] 

       let annotation = MKPointAnnotation() 
       if let location = placemark.location { 
        annotation.coordinate = location.coordinate 
        self.mapView.addAnnotation(annotation) 
       } 
      } 
     }) 

     geoCoder.geocodeAddressString(asiakkaat[1].osoite, completionHandler: { placemarks, error in 
      if error != nil { 
       print(error) 
       return 
      } 

      if let placemarks = placemarks { 
       let placemark = placemarks[0] 

       let annotation = MKPointAnnotation() 
       if let location = placemark.location { 
        annotation.coordinate = location.coordinate 
        self.mapView.addAnnotation(annotation) 
       } 
      } 
     }) 

    } 

Antwort

0

Sie können nicht mehrere gleichzeitige Anrufe zu Geocode-Diensten tätigen.

Aus der Dokumentation von geocodeAddressString(_ addressString: String, completionHandler: CoreLocation.CLGeocodeCompletionHandler):

Sendet eine zukunfts Geocodierungsanfrage die angegebene Zeichenfolge verwendet wird. Diese Methode übergibt die angegebenen Standortdaten asynchron an den Geocodierungsserver und gibt sie zurück. Ihr Completion-Handler-Block wird im Hauptthread ausgeführt. Versuchen Sie nach dem Initiieren einer Forward-Geocoding-Anforderung nicht, eine weitere Forward- oder Reverse-Geocodierungsanforderung einzuleiten.

Sie müssen also den zweiten Anruf tätigen, nachdem der erste abgeschlossen wurde.

Wenn Sie dies tun, werden Sie die richtigen Ergebnisse erhalten:

let geoCoder = CLGeocoder() 

geoCoder.geocodeAddressString(asiakkaat[0].osoite, completionHandler: { placemarks, error in 
    if error != nil { 
     print(error) 
     return 
    } 

    geoCoder.geocodeAddressString(self.asiakkaat[1].osoite, completionHandler: { placemarks, error in 
     if error != nil { 
      print(error) 
      return 
     } 

     if let placemarks = placemarks { 
      let placemark = placemarks[0] 

      let annotation = MKPointAnnotation() 
      if let location = placemark.location { 
       annotation.coordinate = location.coordinate 
       self.mapView.addAnnotation(annotation) 
      } 
     } 
    }) 

    if let placemarks = placemarks { 
     let placemark = placemarks[0] 

     let annotation = MKPointAnnotation() 
     if let location = placemark.location { 
      annotation.coordinate = location.coordinate 
      self.mapView.addAnnotation(annotation) 
     } 
    } 
}) 
+0

Ok, danke für deine Antwort. Ich könnte geoCode auf seine eigene Funktion setzen und sie von der viewDidLoad Funktion aufrufen. Es wird ungefähr 100 Anmerkungen geben. – Erva

+0

@Erva beachten, dass der Geocode ein Ratenlimit hat. Aus der Dokumentation 'Anwendungen sollten bewusst sein, wie sie Geocodierung verwenden. Geocodierungsanforderungen sind für jede App ratenbegrenzt. Wenn also in kurzer Zeit zu viele Anfragen eingehen, können einige der Anforderungen fehlschlagen. (Wenn die maximale Rate überschritten wird, gibt der Geocodierer ein Fehlerobjekt mit dem Wert Netzwerk an den zugehörigen Beendigungshandler zurück.) ' –

+0

Ich habe bereits mit ungefähr 100 Adressen in for-Klausel getestet. Der Geocode hat ungefähr 1/5 der Adressen nicht aufgelöst. Dies erklärt warum. Ich dachte, Geocode habe Adressen nicht "gewusst", aber wahrscheinlich liegt es daran, dass die Rate begrenzt ist. Der Beendigungshandler hat keine Fehlermeldungen ausgegeben. – Erva

Verwandte Themen