我在VC中有一个CoreLocation管理器,当用户按下“获取方向”按钮时,我会初始化位置管理器,应用程序会打开谷歌地图方向,并显示当前位置和一些预先定义的目的地位置。
这是我的问题,如果app不处于后台状态,当前位置几乎总是如此,如果app在同一个VC中从后台调用并且用户再次按下“获取方向”按钮,则当前位置通常显示旧位置。简而言之,我对多任务处理感到困扰,检索到的位置的时间戳并没有解决我的问题。
IBAction为:
if ( self.locationManager ) {
[_locationManager release];
self.locationManager = nil;
}
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.distanceFilter = kCLDistanceFilterNone;
self.locationTimer = [NSTimer scheduledTimerWithTimeInterval:LOCATION_TIMER target:self selector:@selector(stopUpdatingLocationTimer) userInfo:nil repeats:NO];
HUD = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];
[self.locationManager startUpdatingLocation];
核心位置代表:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
NSLog(@"%f",locationAge);
if (locationAge > 3.0)
return;
if (newLocation.horizontalAccuracy < 0)
return;
if ( self.currentLocation == nil || self.currentLocation.horizontalAccuracy > newLocation.horizontalAccuracy ) {
self.currentLocation = newLocation;
if (self.currentLocation.horizontalAccuracy <= self.locationManager.desiredAccuracy) {
[self stopUpdatingLocations:YES];
}
}
}
答案 0 :(得分:0)
在您的示例中,locationAge
是自timestamp
newLocation
以来秒数的负面表示。这意味着locationAge
永远不会超过3,并且您通过筛子有效地让每次更新。
像这样设置locationAge
:
NSTimeInterval locationAge = [newLocation.timestamp timeIntervalSinceNow];
答案 1 :(得分:0)
对于遇到同样问题的人,
此外,一些与网络核心位置相关的教程也引出了这个问题。
当然,每当CLLocation ivar,我都会在我的VC中保留CLLocation ivar 设置和谷歌地图调用,我的应用程序转到后台。
然后,我的应用程序通过用户从后台调用,并开始更新位置,
旧的CLLocation ivar不是零,可能是最好的水平准确性
新来的。因此;
if ( self.currentLocation == nil || self.currentLocation.horizontalAccuracy > newLocation.horizontalAccuracy )
此行导致问题,以及CLLocation ivar中的旧位置 永远不会被取代。
所以我像这样更改了viewDidDisappear并且我将nil值分配给CLLocation变量并且工作正常。
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.locationManager stopUpdatingLocation]; // CLLocationManager
self.locationManager = nil;
[self.locationTimer invalidate]; // NSTimer
self.locationTimer = nil;
self.currentLocation = nil; // CLLocation
}
p.s:谢谢Mark Adams