Расстояние до местоположения во время движения пользователя

Я нахожусь в процессе написания приложения, которое показывает расстояние пользователя от фиксированной точки по мере приближения пользователя (т.е. метка, показывающая расстояние от пользователя до точки, обновляется каждый раз, когда пользователь перемещается). Я использую CLLocationManager с приведенным ниже кодом:

- (void)viewDidLoad
{
    locationManager=[[CLLocationManager alloc]init]; 
    locationManager.distanceFilter = kCLDistanceFilterNone;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    [locationManager startUpdatingLocation];      
}

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation      *)newLocation fromLocation:(CLLocation *)oldLocation 
{   
    CLLocationDistance meters = [newLocation distanceFromLocation:fixedPoint];
    self.distanceLabel.text = [[NSString alloc] initWithFormat:@"Distance: %.1f feet", meters*3.2808399];
}

Метка, которая должна показывать расстояние от пользователя до точки, не обновляется постоянно, а когда она обновляется, она обычно не показывает правильное расстояние от пользователя до фиксированной точки. Мне было интересно, есть ли у меня лучший способ попробовать и сделать это, или фундаментальные ограничения основной структуры размещения делают это невозможным. Любая помощь будет принята с благодарностью.

Ответ 1

Отфильтровываете ли вы старые (кэшированные) позиции? Вы также должны фильтровать на основе точности, вы, вероятно, не хотите мест с низкой точностью.

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

Предполагая, что устройство имеет GPS и может видеть достаточно GPS-спутников, чтобы получить хорошее положение, это прекрасно работает.

-(void)locationManager:(CLLocationManager *)manager 
   didUpdateToLocation:(CLLocation *)newLocation 
          fromLocation:(CLLocation *)oldLocation {

    NSTimeInterval age = -[newLocation.timestamp timeIntervalSinceNow]; 

    if (age > 120) return;    // ignore old (cached) updates

    if (newLocation.horizontalAccuracy < 0) return;   // ignore invalid udpates

    ...
}