非同期呼び出しを待って、結果のアドレスをMKMapView
の目印に入力するのに問題があります。ジオコーディングされたアドレスに基づいてMapViewを更新すると、多数の場所の1つのピンだけが表示されます
地図の表示に1つの目印しか表示されないという問題があります。私はそれをデバッグして配列内に見たので他のものが存在することを知っています。マップビューを完全に埋めるのではなく、MKAnnotation
が割り当てられているだけです。
// 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)
}
}
}
ディスパッチグループが残っている一度あなたが見ることができるように、私はこれが悪いの試みだと思いますけれども、私は、それをリフレッシュするための手段として、すべての注釈を削除し、それらを再追加しようと、明らかにそれはdoesnの地図ビューを変更する(self.salesList
の最初のsale
注釈のみを記録する)
私はここで間違っていますか?
注:self.createMapAnnotation()
は、マップビューに注釈を追加します。
編集:私はこの次試してみました - Wait until swift for loop with asynchronous network requests finishes executingをしかし、私の状況を支援していないようだ
うん、うまくいかないようです。問題は 'myGroup.notify(queue:.main)'は各ジオコードスレッドではなく1回だけ呼び出されるということです – ChewySalmon