我想要的是能够在房屋的车道上走到外面,并在轻按按钮时获取该房屋的地址。
下面的代码可以正常工作,除了有时我在第一次点击按钮时有时得不到正确的地址,我不得不点击几次按钮。
class ViewController: UIViewController, CLLocationManagerDelegate{
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
locationManager.requestWhenInUseAuthorization()
}
@IBAction func myLocation(_ sender: Any) {
locationManager.startUpdatingLocation()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error)-> Void in
if error != nil {
print("Reverse geocoder failed with error: \(error!.localizedDescription)")
return
}
if placemarks!.count > 0 {
let placemark = placemarks![0]
self.locationManager.stopUpdatingLocation()
print("Address: \(placemark.name!) \(placemark.locality!), \(placemark.administrativeArea!) \(placemark.postalCode!)")
}else{
print("No placemarks found.")
}
})
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print("Location manager error: \(error.localizedDescription)")
}
}
如您所见,找到地标后,我将立即停止更新位置,您可以在此处进行一些操作以提高准确性。
在点击按钮时提高准确度以获得最接近地址的逻辑是什么?
答案 0 :(得分:1)
编辑如何检查
每个CLLocation对象都有一个时间戳属性,将其与now
进行比较
(在致电地址解析器之前)
let howRecent = newLocation.timestamp.timeIntervalSinceNow
guard newLocation.horizontalAccuracy < 20 && abs(howRecent) < 10 else { continue }
首先,在致电地址解析之前,您应按照the doc的建议检查manager.location
的时间戳,因为您可能会收到缓存的数据,这些数据并不能真正反映当前位置。
第二,您可能要考虑使用locationManager.requestLocation()
,它会报告一个适合您desiredAccuracy
的位置,并会自动停止。
最后,您始终可以先检查位置对象,以查看是否有足够的精度,然后再发送给地址解析。