Ios 无法从CLGeocoder reverseGeocodeLocation返回字符串

Ios 无法从CLGeocoder reverseGeocodeLocation返回字符串,ios,swift,closures,core-location,clgeocoder,Ios,Swift,Closures,Core Location,Clgeocoder,我想写一个函数来反向地理编码一个位置,并将结果字符串赋给一个变量。在下面的帖子中,我得到了类似的信息: extension CLLocation { func reverseGeocodeLocation(completion: (answer: String?) -> Void) { CLGeocoder().reverseGeocodeLocation(self) { if let error = $1 {

我想写一个函数来反向地理编码一个位置,并将结果字符串赋给一个变量。在下面的帖子中,我得到了类似的信息:

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)
}
对于调用此函数,我得到了如下内容:

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
的字符串值赋给一个变量,我不知道如何将该数据从闭包中传递出去。这样做的最佳方式是什么?

问题是它是异步运行的,因此无法返回值。如果要更新某些属性或变量,正确的位置是在为方法提供的闭包中,例如:

var geocodeString: String?

location.reverseGeocodeLocation { answer in
    geocodeString = answer
    // and trigger whatever UI or model update you want here
}

// but not here

closure
completion
处理程序模式的全部目的是提供异步检索的数据的首选方式。

问题是它异步运行,因此无法返回值。如果要更新某些属性或变量,正确的位置是在为方法提供的闭包中,例如:

var geocodeString: String?

location.reverseGeocodeLocation { answer in
    geocodeString = answer
    // and trigger whatever UI or model update you want here
}

// but not here

closure
completion
处理程序模式的全部目的是提供异步检索的数据的首选方式。

简短回答:您不能。异步编程不是这样工作的。函数
reversegeocodocation
在答案可用之前立即返回。在将来的某个时候,地理代码结果变得可用,当这种情况发生时,将调用闭包中的代码。那就是你对你的答案做些什么的时候。您可以编写闭包以在标签中安装答案、更新表视图或其他行为。(我不记得地理编码方法的闭包是在主线程还是在后台线程上被调用的。如果它们是在后台线程上被调用的,那么您需要将UI调用封装在
dispatch\u async(dispatch\u get\u main\u queue())

简短回答:您不能。异步编程不是这样工作的。函数
reversegeocodocation
在答案可用之前立即返回。在将来的某个时候,地理代码结果变得可用,当这种情况发生时,将调用闭包中的代码。那就是你对你的答案做些什么的时候。您可以编写闭包以在标签中安装答案、更新表视图或其他行为。(我不记得地理编码方法的闭包是在主线程还是在后台线程上被调用的。如果它们是在后台线程上被调用的,那么你需要将你的UI调用打包成
dispatch\u async(dispatch\u get\u main\u queue())

你在我写我的时候发布了你的答案。你以最快的速度打败了我……:)哈哈,对不起。也许堆栈溢出应该有一个功能,你知道是否有人正在键入答案(有点像Skype或一些聊天平台)…谢谢!解决了这个问题✌️你在我写作的时候贴出了你的答案。你以最快的速度打败了我……:)哈哈,对不起。也许堆栈溢出应该有一个功能,你知道是否有人正在键入答案(有点像Skype或一些聊天平台)…谢谢!解决了这个问题✌️FWIW与许多异步API方法不同,使用
reversegeocodocation
您不必担心向主队列分派任何内容。正如“您的完成处理程序块将在主线程上执行。”但您关于主队列的观点是非常好的,因为这与许多其他具有完成处理程序的异步方法有关。@Rob,感谢您的澄清。我不记得
reverseGeocodeLocation
是如何处理它的关闭的,并且在发布我的答案时没有时间查找它。FWIW与许多异步API方法不同,使用
reverseGeocodeLocation
您不必担心向主队列分派任何内容。正如“您的完成处理程序块将在主线程上执行。”但您关于主队列的观点是非常好的,因为这与许多其他具有完成处理程序的异步方法有关。@Rob,感谢您的澄清。我不记得
reversegeocolocation
是如何处理它的关闭的,当我发布我的答案时,我没有时间去查找它。