这里是我使用的代码 - 问题是返回的CLLocationCoordinate2D对象中的纬度和经度值都是-1,即它们的初始化值。我错过了什么?
func getLocationInfoForAddress(shop: store) -> CLLocationCoordinate2D {
var address = getAddressInOneLine(shop)
var latitude: CLLocationDegrees = -1
var longitude: CLLocationDegrees = -1
var geocoder = CLGeocoder()
geocoder.geocodeAddressString(address, {(placemarks: [AnyObject]!, error: NSError!) -> Void in
if let placemark = placemarks?[0] as? CLPlacemark {
latitude = placemark.location.coordinate.latitude
longitude = placemark.location.coordinate.longitude
}
})
var location: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: latitude,longitude: longitude)
return location
}
答案 0 :(得分:2)
geocodeAddressString(:completionHandler:)
方法是异步的:
此方法异步将指定的位置数据提交给地理编码服务器并返回。您的完成处理程序块将在主线程上执行。在发起前向地理编码请求后,请勿尝试启动另一个正向或反向地理编码请求。
因此,在您创建location
并从函数返回后执行它。您需要重构代码以异步处理它。
答案 1 :(得分:2)
作为@NateCook答案的补充,重构代码的一种可能方法是:
func getLocationInfoForAddress(shop: store) {
var address = getAddressInOneLine(shop)
var geocoder = CLGeocoder()
geocoder.geocodeAddressString(address, {(placemarks: [AnyObject]!, error: NSError!) -> Void in
if let placemark = placemarks?[0] as? CLPlacemark {
var latitude = placemark.location.coordinate.latitude
var longitude = placemark.location.coordinate.longitude
var location: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: latitude,longitude: longitude)
self.didReceiveGeocodeAddress(location)
}
})
}
func didReceiveGeocodeAddress(location: CLLocationCoordinate2D) {
// do something
}
获取位置后,您将调用传递该位置的同一类的方法。由于处理程序闭包是在主线程中执行的,因此您可以安全地更新UI组件。