我的代码中有一个奇怪的问题。我想致电[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两次。任何帮助将非常感激。谢谢!
答案 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)在调用locationManager:didUpdateToLocation:fromLocation:和之前需要几秒钟 (2)只调用一次locationManager:didUpdateToLocation:fromLocation:
现在,终止你的应用程序,稍等一下,然后重新启动它。你会看到两件不同的东西: (1)几乎立即调用回调(使用缓存数据),和 (2)回调被调用两次或更多次(取决于你的等待时间和所需的准确度)
有时,你会看到&#34;年龄&#34;第一个位置是从现在开始的几百秒。
您可能知道的其他一些问题here。 希望它有所帮助。