一尘不染

Swift-CLGeocoder reverseGeocodeLocation完成处理程序关闭

swift

我正在试图做的是传递CLLocation给函数getPlacemarkFromLocation,然后使用传递CLLocation通过reverseGeocodeLocation设置CLPlacemark?将返回。

我在中创建completionHandler闭包时遇到了问题reverseGeocodeLocation它引发了编译器错误/崩溃:

在斯威夫特,CLGeocodeCompletionHandlerCLGeocodeCompletionHandler = (AnyObject[]!, NSError!) -> Void根据文档AnyObject[]!应该包含CLPlacemark的对象,就像Objective-C的版本。

这是我当前的代码:

class func getPlacemarkFromLocation(location:CLLocation)->CLPlacemark?{
    var g = CLGeocoder()
    var p:CLPlacemark?
    g.reverseGeocodeLocation(location, completionHandler: {
        (placemarks, error) in
        let pm = placemarks as? CLPlacemark[]
        if (pm && pm?.count > 0){
            p = placemarks[0] as? CLPlacemark
        }
    })
    return p?
}

编辑:似乎错误placemarks.countplacemarks不被视为数组有关。现在编译,但是我想集的时候得到什么,但无pcompletionHandler。我检查了CLLocation传递的,它们是有效的。

编辑2:打印后placemarks,我可以确认它返回了数据。但是p仍然返回nil。


阅读 474

收藏
2020-07-07

共1个答案

一尘不染

我在此线程中找到了所需的答案:使用reverseGeocodeLocation:设置地址字符串,然后从方法返回

问题在于reverseGeocodeLocation异步的事实,方法p在我的示例中在completionBlock设置之前返回一个值。

根据要求,这是我当前的代码。

func showAddViewController(placemark:CLPlacemark){
    self.performSegueWithIdentifier("add", sender: placemark) 
}

func getPlacemarkFromLocation(location: CLLocation){
    CLGeocoder().reverseGeocodeLocation(location, completionHandler:
        {(placemarks, error) in
            if error {println("reverse geodcode fail: \(error.localizedDescription)")}
            let pm = placemarks as [CLPlacemark]
            if pm.count > 0 { self.showAddPinViewController(placemarks[0] as CLPlacemark) }
    })
}

我不想采取NSNotificationCenter路由,因为那样会增加不必要的开销,而是在completionHandler闭包内部调用了另一个函数,并将CLPlacemark生成的by
getPlacemarkFromLocation作为参数传递,以使事情保持异步,因为在placemarks设置函数之后将调用该函数(应该)获得所需的地标并执行所需的代码。希望我所说的有意义。

2020-07-07