我想获取用户的位置。这可能是近似位置,没关系。
在didUpdateLocations
方法中,我看到了两种获取坐标的方法。
manager.location.coordinate
locations
数组我应该去哪一个?我认为位置数组将包含用户最近的位置,因为一旦用户打开应用程序,我就会开始startUpdatingLocation()
。
那么我应该使用哪一个来获取坐标? manager.location.coordinate
在这种情况下做了什么?
注意:位置精度不必精确到10米。粗略估计就足够了。
这是我的代码:
func initLocationUpdates() {
if CLLocationManager.locationServicesEnabled() {
print("going to get location")
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
locationManager.startUpdatingLocation()
}
else {
print("location services disabled")
}
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let locValue:CLLocationCoordinate2D = manager.location!.coordinate
print("locations = \(locValue.latitude) \(locValue.longitude)")
/*
let userLocation:CLLocation = locations[0] // or maybe even locations.last
let long = userLocation.coordinate.longitude;
let lat = userLocation.coordinate.latitude;
print("lat: ", lat, " --- long: ", long)
*/
locationManager.stopUpdatingLocation()
}
答案 0 :(得分:1)
我更喜欢数组而不是实例变量,因为desiredAccuracy
的工作方式 - 它并不能保证您收到的位置更新具有您要求的准确性 - 仅仅是系统将尽最大努力提供它们。根据位置管理器的行为方式,您可能会在locations
数组中获得许多更新,但准确度不同。然后,您可以过滤数组以找到最准确的数组。
关键是,如果多次更新在同一个didUpdateLocations:
来电中到达,而您只是使用manager.location
,则可能会错过更新。缺失的更新肯定不是最新的更新,但它可能是迄今为止收到的最准确的更新。
由于您已将desiredAccuracy
设置为一个非常高的级别(十米),我猜测精度对您来说比时间更重要 - 系统需要一段时间来提供更新准确度(如果您在室内或以其他方式阻止使用GPS,它可能永远不会到达)。因此,上述情况发生的可能性是合理的。
至于实例变量location
的目的,docs建议在应用重启时在某些情况下使用它:
在iOS 4.0及更高版本中,此属性可能在启动时包含更新的位置对象。具体来说,如果正在运行重要的位置更新并且您的应用程序已终止,则在重新启动应用程序时(您创建新的位置管理器对象),将使用最新的位置数据更新此属性。此位置数据可能比您的应用处理的最后一个位置事件更新。