无论何时来自背景,核心位置都会给出旧位置

时间:2011-12-27 22:52:07

标签: ios core-location cllocationmanager

我在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];

    }

}

}

2 个答案:

答案 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