我在等待异步调用时遇到问题,然后将生成的地址填充到MKMapView
的地标中。
问题是只有一个地标最终会显示在地图上。我知道其他的存在是因为我已经调试了它并在数组中看到了这样。它不会完全填充地图视图/刷新分配给它的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)
}
}
}
正如您所看到的,一旦调度组离开,我会尝试删除所有注释并重新添加它们,作为刷新它的一种方法,虽然我认为这是一个不好的尝试,显然它不会改变地图视图(仅记录sale
的第一个self.salesList
注释)
我在这里做错了什么?
注意:self.createMapAnnotation()
会在地图视图中添加注释。
编辑:我试过这个 - Wait until swift for loop with asynchronous network requests finishes executing,但它似乎没有帮助我的情况
答案 0 :(得分:0)
在myGroup.notify(queue:.main)方法完成循环后尝试编写以下代码。
self.mapView?.showAnnotations((self.mapView?.annotations)!, animated: true)