Базовое местоположение дает старое местоположение, когда исходит от фона - PullRequest
2 голосов
/ 28 декабря 2011

У меня есть диспетчер CoreLocation в VC, когда пользователь нажимает кнопку «получить направление», я запускаю диспетчер местоположений, и приложение открывает направление карты Google с текущим местоположением и некоторым заранее определенным местоположением назначения.

Вот мойпроблема, если приложение не находится в фоновом состоянии, текущее местоположение почти всегда истинно, но если приложение вызывает из фона в том же 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 голосов
/ 28 декабря 2011

Для тех, кто сталкивается с той же проблемой,

Кроме того, некоторые учебники, связанные с расположением ядра в Интернете, приводят меня к этой проблеме.

Конечно, я держу CLLocation ivar в моем VC, всякий раз, когда CLLocation ivar Наборы и Google Maps называется, мое приложение переходит в фоновый режим.

Затем мое приложение вызывает пользователя из фонового режима и начинает обновлять местоположения,
и старый 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: спасибо, Марк Адамс

0 голосов
/ 28 декабря 2011

В вашем примере locationAge - это отрицательное представление количества секунд с timestamp из newLocation. Это означает, что locationAge никогда не будет больше 3, и вы эффективно пропускаете каждое обновление через сито.

Установить locationAge как это:

NSTimeInterval locationAge = [newLocation.timestamp timeIntervalSinceNow];
...