Mat*_*tty 2 locationmanager ios swift reversegeocodelocation
我有一个locationManager函数来获取用户当前位置并发布城市和州的名称.我有一个打印声明,所以我可以在我的控制台检查一切是否正常工作......就是这样.但是,它打印城市位置3次.这实际上在我的实际应用程序中引起了一个问题,但这超出了这个问题的范围.
我的功能如下:
var usersLocation: String!
var locationManager: CLLocationManager!
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let userLocation: CLLocation = locations[0]
CLGeocoder().reverseGeocodeLocation(userLocation) { (placemarks, error) -> Void in
if error != nil {
print(error)
} else {
let p = placemarks?.first // ".first" returns the first element in the collection, or nil if its empty
// this code above will equal the first element in the placemarks array
let city = p?.locality != nil ? p?.locality : ""
let state = p?.administrativeArea != nil ? p?.administrativeArea : ""
self.navigationBar.title = ("\(city!), \(state!)")
self.usersLocation = ("\(city!), \(state!)")
self.locationManager.stopUpdatingLocation()
print(self.usersLocation)
self.refreshPosts()
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,在我的print(self.usersLocation)中,它将在我的控制台中打印三次.这是正常的吗?
更新显示视图
override func viewDidLoad() {
super.viewDidLoad()
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 250.0
}
Run Code Online (Sandbox Code Playgroud)
我首先建议一些事情:
stopUpdatingLocation在表演之前打电话reverseGeocodeLocation.
您正在完成处理程序关闭stopUpdatingLocation内部调用reverseGeocodeLocation.问题在于它以异步方式运行,因此didUpdateLocations可能在中间期间接收额外的位置更新.通常,当您第一次启动位置服务时,您将获得许多更新,通常会提高准确性(例如,horizontalAccuracy值越来越小).如果在启动异步地理编码请求之前关闭位置服务,则可以最大限度地减少此问题.
您还可以添加添加distanceFilter中viewDidLoad,将尽量减少对委托方法重复的调用:
locationManager.distanceFilter = 1000
Run Code Online (Sandbox Code Playgroud)您可以使用自己的状态变量来检查是否已启动反向地理编码过程.例如:
private var didPerformGeocode = false
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
// if we don't have a valid location, exit
guard let location = locations.first where location.horizontalAccuracy >= 0 else { return }
// or if we have already searched, return
guard !didPerformGeocode else { return }
// otherwise, update state variable, stop location services and start geocode
didPerformGeocode = true
locationManager.stopUpdatingLocation()
CLGeocoder().reverseGeocodeLocation(location) { placemarks, error in
let placemark = placemarks?.first
// if there's an error or no placemark, then exit
guard error == nil && placemark != nil else {
print(error)
return
}
let city = placemark?.locality ?? ""
let state = placemark?.administrativeArea ?? ""
self.navigationBar.title = ("\(city), \(state)")
self.usersLocation = ("\(city), \(state)")
print(self.usersLocation)
self.refreshPosts()
}
}
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
2121 次 |
| 最近记录: |