同步请求 CLGeocoder.reverseGeocodeLocation

Posted

技术标签:

【中文标题】同步请求 CLGeocoder.reverseGeocodeLocation【英文标题】:Request CLGeocoder.reverseGeocodeLocation synchronously 【发布时间】:2018-01-09 05:48:53 【问题描述】:

在我们的代码中,我们调用了一个方法,据称该方法返回来自 CLGeocoder 的当前设备位置的地址。但问题是 CLGeocoder 异步执行请求并在完成时调用 completionHandler,因此存在“延迟”。

有没有办法执行 reverseGeocodeLocation 并在方法内返回结果?所以基本上被调用的方法需要“等待”直到 CLGeocoder 的请求完成。

【问题讨论】:

【参考方案1】:
func findGMSAddress(completion : @escaping (_ address : LocationModel)->()) 

    let geoCoder = CLGeocoder()
    let loca = CLLocation(latitude: self.location.latitude, longitude: self.location.longitude)
    geoCoder.reverseGeocodeLocation(loca)  (placemarks, error) -> Void in

        if error != nil 
            print("Error getting location: \(String(describing: error))")
         else 
            let placeArray = placemarks as [CLPlacemark]!
            var placeMark: CLPlacemark!
            placeMark = placeArray?[0]
            self.location.name = placeMark.name ?? ""
            self.location.adminArea = placeMark.administrativeArea ?? ""
            self.location.locality = placeMark.locality ?? ""
            self.location.thoroughFare = placeMark.thoroughfare ?? ""

            completion(self.location)
        
    


像这样使用上面的方法:

  // show loader
  self.findGMSAddress(completion:  (address) in
       DispatchQueue.main.async 
            // hide loader

            // use address here
      
  )

【讨论】:

感谢您的回复,不幸的是我们已经尝试过了,但我们认为这并不符合我们的要求。这样做的问题是请求发生在后台,因此该方法在请求完成之前已经返回了一个空字符串。 我和你有同样的问题。当请求位置完全完成时,我尝试使用 KVO 赶上响应。

以上是关于同步请求 CLGeocoder.reverseGeocodeLocation的主要内容,如果未能解决你的问题,请参考以下文章

同步请求和异步请求的区别

OkHttpOkHttp Get 和 Post 请求 ( 同步 Get 请求 | 异步 Get 请求 | 同步 Post 请求 | 异步 Post 请求 )

POST和GET以及同步请求和异步请求的区别

HTTP请求中同步与异步有啥不同

Android 中Okhttp的同步请求与异步请求

servlet的同步请求异步请求以及请求转发与重定型的区别