同步请求 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 请求 )