我正在试图做的是传递CLLocation给函数getPlacemarkFromLocation,然后使用传递CLLocation通过reverseGeocodeLocation设置CLPlacemark?将返回。
CLLocation
getPlacemarkFromLocation
reverseGeocodeLocation
CLPlacemark?
我在中创建completionHandler闭包时遇到了问题reverseGeocodeLocation, 它引发了编译器错误/崩溃:
completionHandler
在斯威夫特,CLGeocodeCompletionHandler是CLGeocodeCompletionHandler = (AnyObject[]!, NSError!) -> Void根据文档AnyObject[]!应该包含CLPlacemark的对象,就像Objective-C的版本。
CLGeocodeCompletionHandler
CLGeocodeCompletionHandler = (AnyObject[]!, NSError!) -> Void
AnyObject[]!
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不被视为数组有关。现在编译,但是我想集的时候得到什么,但无p内completionHandler。我检查了CLLocation传递的,它们是有效的。
placemarks.count
placemarks
p
编辑2:打印后placemarks,我可以确认它返回了数据。但是p仍然返回nil。
我在此线程中找到了所需的答案:使用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设置函数之后将调用该函数(应该)获得所需的地标并执行所需的代码。希望我所说的有意义。