CLLocationManager содержит значение кеша

Эта часть кода CLLocationManager используется для расчета пройденного расстояния. Но кеш местоположения не удаляется даже после использования timeIntervalSinceNow.

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


    if(newLocation != nil && oldLocation != newLocation)
    {
        tempNewLocation = newLocation;
        tempOldLocation = oldLocation;
    }



    NSLog(@"New Location Found");
    NSLog(@"- Latitude: %f", newLocation.coordinate.latitude);
    NSLog(@"- Longitude: %f", newLocation.coordinate.longitude);
    NSLog(@"- Altitude: %f", newLocation.altitude);
    NSLog(@"- Course: %f", newLocation.course);

    NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
    NSLog(@"The location age %f",locationAge);
    if (locationAge > 2.0) 
    {
    }
    else
    {
if (tempOldLocation.coordinate.latitude == tempNewLocation.coordinate.latitude   && tempNewLocation.coordinate.longitude == tempOldLocation.coordinate.longitude) 
{
    NSLog(@" Fix location found ");
}
else
{
    if(tempNewLocation.coordinate.latitude == tempOldLocation.coordinate.latitude && tempNewLocation.coordinate.longitude == tempOldLocation.coordinate.longitude)
    {
        NSLog(@"First Time Location Update");
        latitudeLongitude.text = [[ NSString alloc] initWithFormat:@"%g , %g", tempNewLocation.coordinate.latitude, tempNewLocation.coordinate.longitude];


        totalDistance =  0;
        distance.text = @"0 miles";
    }
    else if ([tempNewLocation distanceFromLocation:tempOldLocation] - tempNewLocation.horizontalAccuracy >= 0) 
    {

    totalDistance +=  [tempNewLocation distanceFromLocation:tempOldLocation] - (tempNewLocation.horizontalAccuracy / 2);
}
else{


    totalDistance +=  [tempNewLocation distanceFromLocation:tempOldLocation];
}



 if (totalDistance < 0) {
        distance.text = @"0 miles";

    }
    else
    milesdistance=0.000621371192*totalDistance;



distance.text = [[ NSString alloc] initWithFormat:@"%.1f", milesdistance];


odometerreading.text = [NSString stringWithFormat:@"%09.1f", milesdistance];
mileagerate.text = [[NSUserDefaults standardUserDefaults] valueForKey:@"savedstring"];


float mileagefloat=[self.mileagerate.text floatValue];
amount.text =  [NSString stringWithFormat:@"%.2f",mileagefloat * milesdistance];
amountstatus.text=[NSString stringWithFormat:@"$%.2f",mileagefloat * milesdistance];
newnumber=totalDistance;



}

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

NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
        NSLog(@"The location age %f",locationAge);
        if (locationAge > 2.0) 

person Sharanya Ramesh    schedule 12.10.2012    source источник


Ответы (4)


Я использую счетчик, который подсчитывает количество вызовов didUpdateToLocation.
Я использую только местоположение, полученное после как минимум 3 вызовов.

Я знаю, что 3 - это магическое число, но я обнаружил, что первые 3 вызова являются кешем или очень неточными.

person Or Arbel    schedule 14.10.2012

Взгляните на ответ на этот вопрос, так как он включает в себя код из примера приложения Apple «LocateMe» и предоставляет более подробную информацию о том, что вы пытаетесь сделать:

https://stackoverflow.com/a/12848776/346098

person cleverbit    schedule 15.10.2012
comment
Привет, Ричард. Спасибо за ссылку, но мне кажется, что код не работает. Мое приложение для расчета расстояния. Когда я запускаю приложение каждый раз, оно вычисляет координату, где я в последний раз остановил его. - person Sharanya Ramesh; 15.10.2012
comment
Насколько я понял, у вас возникли проблемы с определением текущего местоположения пользователя. Что вы хотите сделать, так это сначала определить точное местоположение, а затем сохранить его. Затем (через некоторое время) найдите новое местоположение и, как только оно будет разрешено, сравните его с сохраненным (предыдущим). Предоставленный мной пример кода помогает определить точное местоположение (CLLocationManager не возвращает точное местоположение при первом вызове. Он будет обновляться повторно, пока вы его не остановите ИЛИ не определит местоположение в пределах указанного вами порога, например, 1 км) - person cleverbit; 15.10.2012
comment
Я должен добавить: вы также не хотите делать все это из метода locationManager:didUpdateToLocation:, вам нужно разделить логику. - person cleverbit; 15.10.2012
comment
Спасибо, Ричард. Я попробую. Но даже после сравнения старый кеш местоположения не удаляется, и, следовательно, расчет расстояния будет производиться из старого местоположения. Итак, как мне начать все заново с новым? - person Sharanya Ramesh; 15.10.2012
comment
Что ж, как только вы получите 1-е и 2-е местоположения и убедитесь, что они находятся в пределах желаемого разрешения (например, точность 500 м), рассчитайте расстояние. После того, как вы рассчитали расстояние, ваше первое местоположение (старое местоположение) больше не требуется. Поэтому просто перезапишите его своим новым местоположением: oldLocation = newLocation; — Затем, в следующий раз, когда вы получите обновление местоположения, вы сможете рассчитать расстояние между вашими новыми newLocation и oldLocation. Как прыжок кролика: каждый раз, когда он приземляется, вы вычисляете расстояние, обновляете свои значения, а затем начинаете следующий прыжок! - person cleverbit; 15.10.2012
comment
Я использовал эту логику, но все же она не работает. Позвольте мне попробовать еще раз.. Спасибо, Ричард.. - person Sharanya Ramesh; 15.10.2012
comment
Удачи! Пожалуйста, не забудьте принять или проголосовать за ответ, если он был полезен! - person cleverbit; 15.10.2012

Вы хотите проверить свойство timestamp нового объекта CLLocation в методе делегата. Судя по звукам интересуют только широта/долгота не старше ХХХ секунд.

NSTimeInterval timeInSeconds = [newLocation.timestamp timeIntervalSinceNow];
if (timeInSeconds > YOUR_CUSTOM_TIME_IN_SECONDS)
{
    // Do something
}
person Rog    schedule 14.10.2012
comment
Надеюсь, я использовал тот же оператор, но что мне делать внутри цикла? - person Sharanya Ramesh; 15.10.2012
comment
В вашем коде выше много неправильных вещей. Во-первых, вы сравниваете указатели на newLocation и oldLocation, чтобы увидеть, находятся ли они в одних и тех же координатах, это никогда не сработает. Извините, но вам нужно будет вернуться и провести некоторое исследование объектно-ориентированного языка, сравнения указателей и т. д. Сначала разберитесь с основами, а затем вернитесь, и кто-то сможет вам помочь. - person Rog; 15.10.2012
comment
Спасибо за помощь, Родж. Я новичок в задаче C. Мне нужно много работать! - person Sharanya Ramesh; 15.10.2012
comment
Это решение не работает, если пользователь меняет дату и время устройства. - person Yogendra Patel; 24.07.2019

Я нашел ответ для удаления кеша. При первом вызове didUpdateToLocation newlocation извлекает значение кэша, а old location равно нулю. И во втором вызове значение newlocation заменяется на oldlocation, а newlocation обновляется. И, следовательно, чтобы получить обновленное значение, функция должна быть вызвана дважды.

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

        static CLLocation *locationanalysis1;
    NSLog(@"New Location Found");
    NSLog(@"- Latitude: %f", newLocation.coordinate.latitude);
    NSLog(@"- Longitude: %f", newLocation.coordinate.longitude);
    NSLog(@"- Altitude: %f", newLocation.altitude);
    NSLog(@"- Course: %f", newLocation.course);

    NSDate *eventDate = newLocation.timestamp; 
    NSTimeInterval howRecent = -[eventDate timeIntervalSinceNow];
    if (howRecent > maximumElapsedTimeForCachedLocation)  {             

            locationanalysis1=newLocation;

        return;
}


    if((locationanalysis1.coordinate.latitude-oldLocation.coordinate.latitude)==0){
        NSLog(@"Old Location in location analysis is %@",oldLocation);


      return;
    }

    NSLog(@"New location accuracy %.0fm", newLocation.horizontalAccuracy);
    if ((newLocation.horizontalAccuracy < 0) || (newLocation.horizontalAccuracy > 10)) return;
    if(oldLocation!=NULL && newLocation!=NULL){

                totalDistance +=  [newLocation distanceFromLocation:oldLocation];
    }else return;
}
person Sharanya Ramesh    schedule 17.10.2012