0

MapView で 2 つの注釈を表示しようとしています。

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

for句を使用することもできましたが、テストのためにコードを繰り返しました。

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

    }
4

1 に答える 1

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)
        }
    }
})
于 2016-11-24T20:36:22.730 に答える