CLLocationmanager两次更新位置

时间:2015-03-29 11:54:06

标签: ios objective-c cllocationmanager

我的代码中有一个奇怪的问题。我想致电[locationManager startUpdatingLocation];,当更新完成时 - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation立即停止使用[locationManager stopUpdatingLocation]进行更新。我把它作为方法的第一行。但有时它会被调用两次。任何人都可以给我一些指示,为什么会发生这种情况?如果我做的第一件事是在我拿到第一件事时停止更新,对我来说没有意义。一些代码:

-(void)getLocation{

    [locationManager requestWhenInUseAuthorization];
    [locationManager startUpdatingLocation];


}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    [locationManager stopUpdatingLocation]; //kill it NOW or we have duplicates
    NSLog(@"didUpdateToLocation: %@", newLocation);

  //do other stuff....

}

我知道它是重复的,因为我偶尔会在屏幕上获得NSLog两次。任何帮助将非常感激。谢谢!

2 个答案:

答案 0 :(得分:3)

此委托方法通常首先使用缓存数据调用,然后再使用更新的位置数据调用。

您可以在使用之前查看位置数据的年龄。例如:

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{
   NSTimeInterval t = [[newLocation timestamp] timeIntervalSinceNow];
   // If this location was made more than 3 minutes ago, ignore it.
   if (t < -180) {
      // This is cached data, you don't want it, keep looking
      return;
   }

  [self foundLocation:newLocation];
}

此外,如果您已经从CLLocation Manager请求了高级别的准确性,则随着精确度的提高,将多次调用didUpdateToLocation委托。如果你真的只想要第一个(可能不是这种情况),设置一个布尔值来跟踪你已经收到位置的事实,这样你就可以忽略后续的调用。

答案 1 :(得分:1)

要理解回调(locationManager:didUpdateToLocation:fromLocation:或locationManager:didUpdateLocations :)被称为两次(事件超过两次)的原因,我们应该看看&#34;屏幕后面&#34;获取位置数据的CLLocationManager:

Calculating a phone’s location using just GPS satellite data can take
up to several minutes. iPhone can reduce this time to just **a few seconds**
by using Wi-Fi hotspot and cell tower data to quickly find GPS satellites.

问题1:有人可以给我一些指示,说明为什么会发生这种情况吗?

答案:CLLocationManager会尽快为您提供位置,以便您可以在不等待几秒钟的情况下处理逻辑。为此,它会缓存上次调用[locationManager startUpdatingLocation]时的位置数据。

要验证这一点,您可以尝试卸载应用,关闭主位置服务,然后重新安装应用并启动它。 你会看到两件事: (1)在调用locationManager:didUpdateToLocation:fromLocation:和之前需要几秒钟 (2)只调用一次locationManager:didUpdateToLocation:fromLocation:

现在,终止你的应用程序,稍等一下,然后重新启动它。你会看到两件不同的东西: (1)几乎立即调用回调(使用缓存数据),和 (2)回调被调用两次或更多次(取决于你的等待时间和所需的准确度)

问题2:所以第一次更新它不是很准确吗?

答案:是的。你必须检查&#34;年龄&#34;在使用它之前的位置(如@Foster Bass)和所需的准确度。

有时,你会看到&#34;年龄&#34;第一个位置是从现在开始的几百秒。

您可能知道的其他一些问题here。 希望它有所帮助。