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

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

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

【问题讨论】:

    标签: swift4 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 赶上响应。
    猜你喜欢
    • 2015-07-10
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 2023-04-01
    • 2015-11-21
    相关资源
    最近更新 更多