CLGeoCoder 没有以正确的顺序附加地标

CLGeoCoder doesn't append placemarks in right order

在我的 viewDidLoad 中,我有这个方法可以将位置从 Parse 转换为城市和州。唯一的问题是,它大多数时候以错误的顺序追加。我在 location 变量末尾的 .location 也是一个自定义方法,可以将 PFGeoPoint 转换为 CLLocation。

for post in posts {
let location = ((post["locations"] as! NSMutableArray)[0] as! PFGeoPoint).location

    CLGeocoder().reverseGeocodeLocation(location()) { (placemarks, error) -> Void in
        if error != nil {

            print(error)

        } else {

            let p = CLPlacemark(placemark: placemarks![0])


            let locationString = "\(p.locality!), \(p.administrativeArea!)"

            self.locationStrings.append(locationString)

        }

    }
}

我相信这一切都是因为 CLGeoCoder 完成处理程序需要一段时间才能完全执行。我认为这可以通过在没有完成处理程序的情况下完成所有这些来解决,但我不确定该怎么做。谢谢!

需要异步进行反向地理编码以防止延迟。您可以创建一个对象来保存您的 post 位置数据,或者一般的 post 数据,带有位置字符串 属性。实例化 post 对象并将它们添加到数组中,然后遍历它们以检索位置字符串并将其设置在对象上。例如:

for postObject in postObjects {
CLGeocoder().reverseGeocodeLocation(postObject.location) { (placemarks, error) -> Void in
    if error != nil {

        print(error)

    } else {

        let p = CLPlacemark(placemark: placemarks![0])


        postObject.locationString = "\(p.locality!), \(p.administrativeArea!)"

    }

}
}