Swift 反向地理编码的完成处理程序
Swift Completion Handler for Reverse Geocoding
我一直在绞尽脑汁想弄清楚如何修复这段代码。基本上我有一段代码,它接受一个字符串 cityName 并将它的纬度和经度存储在一个全局变量中,然后在另一个函数中调用它。显然因为异步调用,我无法做到这一点,经度和纬度的值为零。
func findCityCoordinates(cityName: String) {
var geocoder = CLGeocoder()
geocoder.geocodeAddressString(cityName, completionHandler: {(placemarks: [AnyObject]!, error: NSError!) -> Void in
if let placemark = placemarks?[0] as? CLPlacemark {
self.cityLatitude = placemark.location.coordinate.latitude //Returns nil
self.cityLongitude = placemark.location.coordinate.longitude //Returns nil
}
})
}
我也一直在尝试解决完成处理程序,但我不知道如何实现它并在函数中调用它。我将不胜感激。
我能够为此使用分派异步。我在geocoder上面声明了两个变量,在里面赋值,完成后使用。
var lat:Float!
var long:Float!
let geocoder = CLGeocoder()
geocoder.geocodeAddressString(cityName, completionHandler: {(placemarks: [AnyObject]!, error: NSError!) -> Void in
if let placemark = placemarks?[0] as? CLPlacemark {
lat = Float(placemark.location.coordinate.latitude)
long = Float(placemark.location.coordinate.longitude)
}
dispatch_async(
dispatch_get_main_queue(), {
self.cityLatitude = lat
self.cityLongitude = long
})
})
...stores the latitude and longitude of it in a global variable and call it in another function right after
我怀疑其他函数在地理编码器完成块设置值之前正在使用它。如果可能,将对其他函数的调用放到完成块中。
func findCityCoordinates(cityName: String) {
var geocoder = CLGeocoder()
geocoder.geocodeAddressString(cityName, completionHandler: {(placemarks: [AnyObject]!, error: NSError!) -> Void in
if let placemark = placemarks?[0] as? CLPlacemark {
self.cityLatitude = placemark.location.coordinate.latitude //Returns nil
self.cityLongitude = placemark.location.coordinate.longitude //Returns nil
*** <-- call your function that uses location here --> ***
}
})
}
好吧,我的兄弟在这方面帮了我一点忙,基本上我想 运行 保存按钮的 IBAction 中的一个完成块,而不是函数 findCityCoordinates:
func findCityCoordinate(city: String, completionHandler: (coordinate: CLLocationCoordinate2D) -> ()) {
let geocoder = CLGeocoder()
geocoder.geocodeAddressString(city) { (placemarks: [AnyObject]!, error: NSError!) -> () in
if let placemark = placemarks[0] as? CLPlacemark {
let coordinate = placemark.location.coordinate
completionHandler(coordinate: coordinate)
}
}
}
下面是在 saveButton 操作出口中调用的函数:
findCityCoordinates(searchBar.text) { (cityCoordinate: CLLocationCoordinate2D) -> () in
self.queryForTable(cityCoordinate)
// Force reload of table data
self.myTableView.reloadData()
}
我一直在绞尽脑汁想弄清楚如何修复这段代码。基本上我有一段代码,它接受一个字符串 cityName 并将它的纬度和经度存储在一个全局变量中,然后在另一个函数中调用它。显然因为异步调用,我无法做到这一点,经度和纬度的值为零。
func findCityCoordinates(cityName: String) {
var geocoder = CLGeocoder()
geocoder.geocodeAddressString(cityName, completionHandler: {(placemarks: [AnyObject]!, error: NSError!) -> Void in
if let placemark = placemarks?[0] as? CLPlacemark {
self.cityLatitude = placemark.location.coordinate.latitude //Returns nil
self.cityLongitude = placemark.location.coordinate.longitude //Returns nil
}
})
}
我也一直在尝试解决完成处理程序,但我不知道如何实现它并在函数中调用它。我将不胜感激。
我能够为此使用分派异步。我在geocoder上面声明了两个变量,在里面赋值,完成后使用。
var lat:Float!
var long:Float!
let geocoder = CLGeocoder()
geocoder.geocodeAddressString(cityName, completionHandler: {(placemarks: [AnyObject]!, error: NSError!) -> Void in
if let placemark = placemarks?[0] as? CLPlacemark {
lat = Float(placemark.location.coordinate.latitude)
long = Float(placemark.location.coordinate.longitude)
}
dispatch_async(
dispatch_get_main_queue(), {
self.cityLatitude = lat
self.cityLongitude = long
})
})
...stores the latitude and longitude of it in a global variable and call it in another function right after
我怀疑其他函数在地理编码器完成块设置值之前正在使用它。如果可能,将对其他函数的调用放到完成块中。
func findCityCoordinates(cityName: String) {
var geocoder = CLGeocoder()
geocoder.geocodeAddressString(cityName, completionHandler: {(placemarks: [AnyObject]!, error: NSError!) -> Void in
if let placemark = placemarks?[0] as? CLPlacemark {
self.cityLatitude = placemark.location.coordinate.latitude //Returns nil
self.cityLongitude = placemark.location.coordinate.longitude //Returns nil
*** <-- call your function that uses location here --> ***
}
})
}
好吧,我的兄弟在这方面帮了我一点忙,基本上我想 运行 保存按钮的 IBAction 中的一个完成块,而不是函数 findCityCoordinates:
func findCityCoordinate(city: String, completionHandler: (coordinate: CLLocationCoordinate2D) -> ()) {
let geocoder = CLGeocoder()
geocoder.geocodeAddressString(city) { (placemarks: [AnyObject]!, error: NSError!) -> () in
if let placemark = placemarks[0] as? CLPlacemark {
let coordinate = placemark.location.coordinate
completionHandler(coordinate: coordinate)
}
}
}
下面是在 saveButton 操作出口中调用的函数:
findCityCoordinates(searchBar.text) { (cityCoordinate: CLLocationCoordinate2D) -> () in
self.queryForTable(cityCoordinate)
// Force reload of table data
self.myTableView.reloadData()
}