iOS Swift – CLGeocoder completionHandler块

我试图parsing一个位置(CLLocation)到一个string。

func locationToString (currentLocation: CLLocation) -> String? { var whatToReturn: String? CLGeocoder().reverseGeocodeLocation(currentLocation, completionHandler: { (placemarks: [AnyObject]!, error: NSError!) in if error == nil && placemarks.count > 0 { let location = placemarks[0] as CLPlacemark whatToReturn = "\(location.locality) \(location.thoroughfare) \(location.subThoroughfare)" } }) return whatToReturn } 

显然,whatToReturn总是返回null,因为completionHandler在后台运行。 我很难理解在completionHandler完成时如何更新我的string?

谢谢。

如果你想在textField中使用你的string,就像你的注释中所指出的那样,这样做:

 func getAndDisplayLocationStringForLocation(currentLocation: CLLocation) { CLGeocoder().reverseGeocodeLocation(currentLocation, completionHandler: { (placemarks: [AnyObject]!, error: NSError!) in if error == nil && placemarks.count > 0 { let location = placemarks[0] as CLPlacemark self.textField.text = "\(location.locality) \(location.thoroughfare) \(location.subThoroughfare)" } }) } 

但是,如果你需要访问其他地方,也许可以通过一个封闭的arg:

 func getAndDisplayLocationStringForLocation(currentLocation: CLLocation, withCompletion completion: (string: String?, error?, error: NSError?) -> ()) { CLGeocoder().reverseGeocodeLocation(currentLocation, completionHandler: { (placemarks: [AnyObject]!, error: NSError!) in if error == nil && placemarks.count > 0 { let location = placemarks[0] as CLPlacemark completion(string: "\(location.locality) \(location.thoroughfare) \(location.subThoroughfare)", error: nil) } else { completion(nil, error) } }) } 

然后像这样打电话:

 yourModel.getAndDisplayLocationStringForLocation(someLocation) { (string: String?, error: NSError?) -> () in if (error == nil) { self.textField.text = string } } 

你可能想要处理错误等不同。 这应该足以让你开始。