根据地理编码地址更新MapView,只显示许多位置的一个引脚

时间:2017-06-11 07:17:17

标签: ios swift mkmapview mapkit mapkitannotation

我在等待异步调用时遇到问题,然后将生成的地址填充到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,但它似乎没有帮助我的情况

1 个答案:

答案 0 :(得分:0)

在myGroup.notify(queue:.main)方法完成循环后尝试编写以下代码。

self.mapView?.showAnnotations((self.mapView?.annotations)!, animated: true)