无法从 CLGeocoder reverseGeocodeLocation 返回字符串
Posted
技术标签:
【中文标题】无法从 CLGeocoder reverseGeocodeLocation 返回字符串【英文标题】:Unable Return String from CLGeocoder reverseGeocodeLocation 【发布时间】:2016-08-08 00:15:30 【问题描述】:我想编写一个函数来对位置进行反向地理编码并将结果字符串分配给一个变量。在this 的帖子之后,我得到了这样的信息:
extension CLLocation
func reverseGeocodeLocation(completion: (answer: String?) -> Void)
CLGeocoder().reverseGeocodeLocation(self)
if let error = $1
print("[ERROR] \(error.localizedDescription)")
return
if let a = $0?.last
guard let streetName = a.thoroughfare,
let postal = a.postalCode,
let city = a.locality else return
completion(answer: "[\(streetName), \(postal) \(city)]")
为了调用这个函数,我得到了这样的东西:
location.reverseGeocodeLocation answer in
print(answer)
但是我想将answer
的字符串值分配给一个变量,但我不知道如何将该数据从闭包中传递出去。做这种事情的最佳方法是什么?
【问题讨论】:
【参考方案1】:问题是它异步运行,所以你不能返回值。如果你想更新一些属性或变量,正确的地方是在你提供给方法的闭包中,例如:
var geocodeString: String?
location.reverseGeocodeLocation answer in
geocodeString = answer
// and trigger whatever UI or model update you want here
// but not here
闭包completion
处理程序模式的全部目的是提供异步检索的数据的首选方式。
【讨论】:
你在我写我的时候发布了你的答案。你在几秒钟内击败了我...... :) 大声笑。对不起。也许 Stack Overflow 应该有一个功能,您可以知道是否有人当前正在输入答案(有点像 Skype 或某些聊天平台)...... 谢谢!解决了问题✌️【参考方案2】:简短的回答:你不能。这不是异步编程的工作方式。在答案可用之前,函数reverseGeocodeLocation
立即返回。在未来的某个时候,地理编码结果变得可用,并且当这种情况发生时,您的闭包中的代码会被调用。那就是当你对你的答案做某事的时候。您可以编写闭包以在标签中安装答案、更新表格视图或其他一些行为。 (我不记得地理编码方法的闭包是在主线程还是后台线程上调用的。如果在后台线程上调用它们,那么您需要将 UI 调用包装在 dispatch_async(dispatch_get_main_queue())
中。)
【讨论】:
FWIW,与许多异步 API 方法不同,使用reverseGeocodeLocation
您不必担心将任何内容分派到主队列。作为the docs say,“您的完成处理程序块将在主线程上执行。”但是您关于主队列的观点非常好,因为这是许多其他带有完成处理程序的异步方法的问题。
@Rob,感谢您澄清这一点。我不记得reverseGeocodeLocation
是如何处理它的关闭并且在我发布我的答案时没有时间查找它。以上是关于无法从 CLGeocoder reverseGeocodeLocation 返回字符串的主要内容,如果未能解决你的问题,请参考以下文章