Сбой проверки CLLocationManager didUpdateToLocation - PullRequest
0 голосов
/ 08 августа 2011

Я пытаюсь получить координаты местоположения с помощью CLLocationManager.Вот мой код

- (void)viewDidLoad {
    [super viewDidLoad];

    //instantiate location manager and set delegate
    self.locationManager=[[CLLocationManager alloc]init];
    locationManager.delegate=self;
    // can be set to 100m,1km,3km etc.
    //locationManager.distanceFilter=10.0f;
    locationManager.desiredAccuracy=kCLLocationAccuracyNearestTenMeters;
    //start updating the delegate
    [locationManager startUpdatingLocation];
}

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

    // Check if the coordinates are different from the old ones
    if (newLocation.coordinate.latitude != oldLocation.coordinate.latitude && 
        newLocation.coordinate.longitude != oldLocation.coordinate.longitude) {     

        NSLog(@"not equal");        
    } else {
        NSLog(@"equal");
    }
}

Однако я считаю, что условие вызывается дважды.В первый раз условие выполняется, и печатается не равно , и сразу же вызывается снова и печатается "равно".Может ли кто-нибудь мне помочь?Что я делаю не так?

Спасибо

1 Ответ

2 голосов
/ 08 августа 2011

Это потому, что CoreLocation кэширует ваше последнее местоположение и возвращает его сразу после того, как вы вызвали startUpdatingLocation , поэтому вам нужно проверить временную метку координаты, и она слишком старая, вы можете игнорировать старую координату.

UPDATE:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    if([newLocation horizontalAccuracy] < 0.0f) return;
    if(fabs([[newLocation timestamp] timeIntervalSinceNow]) > kCLLocationMaximumLocationDataAge) return;
    if(fabs([[oldLocation timestamp] timeIntervalSinceNow]) < kCLLocationMaximumLocationDataAge && [newLocation getDistanceFrom:oldLocation] < 0.1f && [newLocation horizontalAccuracy] == [oldLocation horizontalAccuracy])
        return;
    if(((runningHighPreciseLocationDetectionService||runningLowPowerLocationDetectionService) && ([newLocation horizontalAccuracy] <= kCLLocationAccuracyHundredMeters))){
        NSLog(@"---> \n%@\n%@\nHorizontal accurecy: %f\nLocation age: %fs\nOld location age: %fs", NSStringFromSelector(_cmd), newLocation, newLocation.horizontalAccuracy, fabs([[newLocation timestamp] timeIntervalSinceNow]), fabs([[oldLocation timestamp] timeIntervalSinceNow]));
    } else {
        NSLog(@"\n-------------- BAD ---------------\n%@\n%@\nHorizontal accurecy: %f\nLocation age: %fs\nOld location age: %fs\n----------------------------------", NSStringFromSelector(_cmd), newLocation, newLocation.horizontalAccuracy, fabs([[newLocation timestamp] timeIntervalSinceNow]), fabs([[oldLocation timestamp] timeIntervalSinceNow]));
    }
    if(((runningHighPreciseLocationDetectionService||runningLowPowerLocationDetectionService) && ([newLocation horizontalAccuracy] <= kCLLocationAccuracyHundredMeters))){
        [self stopLocationImprovementTimer];
    } else [self createLocatinoImprovementTimer];
}

createLocatinoImprovementTimer метод, используемый для запуска таймера, который будет работать определенное количество времени, и если он не был остановлен, он будет отправлять и обновлять уведомление с указанием местоположения, которое было последним. Этот таймер поможет с большей точностью ожидать координаты, прежде чем уведомлять контроллеры.

...