2013-07-15 52 views
0

基于另一个SO问题,我已经实现了didUpdateLocations:方法如下:didUpdateToLocations:永不结束?

- (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
{ 
    // Get the latest location found 
    CLLocation *location = [locations lastObject]; 

    NSTimeInterval locationAge = -[location.timestamp timeIntervalSinceNow]; 

    if (locationAge > 5.0) return; 
    if (location.horizontalAccuracy < 0) return; 

    if (_bestEffort == nil || _bestEffort.horizontalAccuracy >= location.horizontalAccuracy) { 
     _bestEffort = location; 

     // Let the delegate know 
     if (self.delegate && [self.delegate respondsToSelector:@selector(location:didUpdateLocationTo:)]) { 
      [self.delegate location:self didUpdateLocationTo:location]; 
     } 

     if (location.horizontalAccuracy <= _locationManager.desiredAccuracy) { 
      // Great, we've found our final location so stop searching! 
      [self stopTrackingLocation]; 

      // Let our delegate know we've finished our work 
      if (self.delegate && [self.delegate respondsToSelector:@selector(location:didFinishTrackingLocationWithFinalLocation:)]) { 
       [self.delegate location:self didFinishTrackingLocationWithFinalLocation:location]; 
      } 
     } 
    } 
} 

一切有意义此代码,但我似乎无法使其正常工作。当我通过代码,我发现

  • locationAge小于5,这是很好的
  • 位置horizo​​ntalAccuracy小于0,这是很好
  • bestEfforts水平精度相同的位置水平准确性,所以它永远不会进入该条件
  • 即使它做到了,它也不会调用stopTrackingLocation方法,因为horizo​​ntalAccuracy的位置永远不会是< 0(第二个if语句),但是,我的位置管理器所需的准确度为-2(最佳对于导航),所以它从来没有实际上离开这个方法。

我在做什么错,或者我应该如何改变它以正确工作?

+0

horizo​​ntalAccuracy小于0表示该位置无效。 – progrmr

+0

为什么你想要的准确度为'-2'?它应该是一个正值,如50或100,取决于您需要多少准确度(以米为单位)? – progrmr

+0

这就是我的想法,但这正是我所得到的。我传入'kCLLoationAccuracyBestForNavigation'并获得-2,'kCLLocationAccuracyBest'则传递-1。我把它改成了10米,看起来不错,但我仍然不明白为什么我会为其他两个获得-1/-2? – PaReeOhNos

回答

0

问题是,您正试图获得水平精度低于您所需的精度的位置。

if (location.horizontalAccuracy <= _locationManager.desiredAccuracy) { 

然而,常数kCLLoationAccuracyBestForNavigationkCLLocationAccuracyBest不是真正的价值,他们是-2和-1分别。

问题是你真的需要什么准确性需要为你的目的?这是你应该检查的价值。为了测试目的,使用100米。这意味着你可能有一个使用GPS的位置,而不仅仅是WiFi或者蜂窝。

if (location.horizontalAccuracy <= 100) { 

实际horizo​​ntalAccuracy绝不会小于5米,与iPhone 5,它可以是取决于有多少颗卫星是可见的,其几何形状10或20或50。如果系统根本无法修复,它也可以是-1。这就是这条线是,忽略那些无效的位置:

if (location.horizontalAccuracy < 0) return; 

编辑:
常数kCLLoationAccuracyBestForNavigation当你配置CLLocationManager对象的desiredAccuracy财产kCLLocationAccuracyBest,才应使用。 desiredAccuracy设置将核心位置硬件配置为启用GPS,GLONASS等,以尝试以满足您所需的准确性(并不保证它会被满足)。

desiredAccuracy不是您应该在委托方法中使用的值,它只是在那里配置CLLocationManager。

+0

我明白代码在做什么以及为什么它永远不会返回。我无法弄清楚为什么导航和最佳准确度值是-1和-2,并且我找不到任何以这种方式使用它们的例子。我已经将代码降到了最接近的10米,因为精确度不是很重要,但我确实希望能够从用户位置(准确地)检索地址,因为它将用于导航目的。 – PaReeOhNos

+0

我添加了更多上面我的回答解释说,你仍然想使用这些常量,但只有在设置'desiredAccuracy'属性时。 – progrmr

+0

很好的解释,欢呼:) – PaReeOhNos