无法使用来自 CLGeocoder reverseGeocodeLocation 的 Return 字符串

Unable Return String from CLGeocoder reverseGeocodeLocation

我想编写一个函数来对位置进行反向地理编码并将结果字符串分配给一个变量。在 post 之后,我得到了这样的东西:

extension CLLocation {

    func reverseGeocodeLocation(completion: (answer: String?) -> Void) {

        CLGeocoder().reverseGeocodeLocation(self) {

            if let error =  {
                print("[ERROR] \(error.localizedDescription)")
                return
            }

            if let a = [=11=]?.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 的字符串值分配给一个变量,但我不知道如何将该数据传递出闭包。执行此类操作的最佳方法是什么?

问题是它是异步运行的,所以你不能return这个值。如果你想更新一些 属性 或变量,正确的地方是在你提供给方法的闭包中,例如:

var geocodeString: String?

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

// but not here

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

简答:你不能。这不是异步编程的工作方式。在答案可用之前立即执行 reverseGeocodeLocation returns 函数。在未来的某个时候,地理编码结果可用,当这种情况发生时,您的闭包中的代码将被调用。那就是当你对你的答案做些什么的时候。您可以编写闭包以在标签中安装答案、更新 table 视图或其他一些行为。 (我不记得地理编码方法的闭包是否在主线程或后台线程上被调用。如果它们在后台线程上被调用,那么您需要将 UI 调用包装在 dispatch_async(dispatch_get_main_queue()) 中.)