gpt4 book ai didi

ios - Swift - CLGeocoder reverseGeocodeLocation completionHandler 闭包

转载 作者:IT王子 更新时间:2023-10-29 05:10:09 28 4
gpt4 key购买 nike

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

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


在 Swift 中,CLGeocodeCompletionHandler 根据文档 AnyObject[]!CLGeocodeCompletionHandler = (AnyObject[]!, NSError!) -> Void > 应该像 Objective-C 版本一样包含 CLPlacemark 对象。

这是我当前的代码:

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.count 有关,而 placemarks 未被视为数组。它现在可以编译,但是当我试图在 completionHandler 中设置 p 时,我什么也没得到。我检查了正在传递的 CLLocation,它们是有效的。

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

最佳答案

我在这个线程中找到了我需要的答案:Set address string with reverseGeocodeLocation: and return from method

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


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

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 getPlacemarkFromLocation 作为保持异步的参数,因为该函数将在 placemarks 设置后调用,函数(应该)接收所需的地标并执行您想要的代码。希望我说的有道理。

关于ios - Swift - CLGeocoder reverseGeocodeLocation completionHandler 闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24345296/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com