哪一个在iOS中的Swift中使用“locations array”或“manager.location.coordinate”来获取用户位置?

时间:2016-06-18 12:51:10

标签: ios swift cllocationmanager location-services

我想获取用户的位置。这可能是近似位置,没关系。 在didUpdateLocations方法中,我看到了两种获取坐标的方法。

  1. 使用manager.location.coordinate
  2. 使用locations数组
  3. 我应该去哪一个?我认为位置数组将包含用户最近的位置,因为一旦用户打开应用程序,我就会开始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()
    }
    

1 个答案:

答案 0 :(得分:1)

我更喜欢数组而不是实例变量,因为desiredAccuracy的工作方式 - 它并不能保证您收到的位置更新具有您要求的准确性 - 仅仅是系统将尽最大努力提供它们。根据位置管理器的行为方式,您可能会在locations数组中获得许多更新,但准确度不同。然后,您可以过滤数组以找到最准确的数组。

关键是,如果多次更新在同一个didUpdateLocations:来电中到达,而您只是使用manager.location,则可能会错过更新。缺失的更新肯定不是最新的更新,但它可能是迄今为止收到的最准确的更新。

由于您已将desiredAccuracy设置为一个非常高的级别(十米),我猜测精度对您来说比时间更重要 - 系统需要一段时间来提供更新准确度(如果您在室内或以其他方式阻止使用GPS,它可能永远不会到达)。因此,上述情况发生的可能性是合理的。

至于实例变量location的目的,docs建议在应用重启时在某些情况下使用它:

  

在iOS 4.0及更高版本中,此属性可能在启动时包含更新的位置对象。具体来说,如果正在运行重要的位置更新并且您的应用程序已终止,则在重新启动应用程序时(您创建新的位置管理器对象),将使用最新的位置数据更新此属性。此位置数据可能比您的应用处理的最后一个位置事件更新。