2016-11-24 13 views
0

MapViewで2つのアノテーションを表示しようとしています。2番目のMKPointAnnotationが表示されない理由

MapViewに2番目の注釈が表示されないのはなぜですか?目印[0]をマーク[1]に変更しようとしましたが、助けが必要ありません。

私は句のために使用できましたが、テストのためにコードを繰り返しました。

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) 
       } 
      } 
     }) 

    } 

答えて

0

ジオコードサービスを複数同時に呼び出すことはできません。 geocodeAddressString(_ addressString: String, completionHandler: CoreLocation.CLGeocodeCompletionHandler)のドキュメントから

は、指定した文字列を使用して、前方ジオコーディング要求を送信します。この メソッドは、指定されたロケーションデータをジオコーディングサーバー に非同期で送信して返します。完了ハンドラブロックは、メインスレッドで実行される になります。 順方向ジオコーディング 要求を開始した後、別の順方向または逆方向ジオコーディング要求を開始しないでください。

したがって、最初のコールが完了した後に2回目のコールを行う必要があります。あなたがこれを行う場合は

あなたは正しい結果を得るでしょう:あなたの答えのための

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]を、ありがとう。私はそれ自身の関数であるgeoCodeを配置し、viewDidLoad関数から呼び出すかもしれません。約100の注釈があります。 – Erva

+0

@Ervaは、ジオコードにレート制限があることに注意してください。 docsからアプリケーションはジオコーディングの使い方を意識している必要があります。ジオコーディングリクエストは各アプリのレート制限があるため、短時間でリクエストを増やすとリクエストの一部が失敗する可能性があります。 (最大レートを超えると、ジオコーダーは値networkを持つエラーオブジェクトを対応する補完ハンドラーに返します)。 –

+0

for節で約100のアドレスで既にテストしました。ジオコードはアドレスの約1/5を解決しませんでした。これが理由を説明します。私はジオコードがアドレスを「知っていない」と思ったが、おそらくそれはレート制限のためだ。完了ハンドラがエラーメッセージを表示しませんでした。 – Erva

関連する問題