CLLocationManager保存caching值

CLLocationManager这部分代码用于计算行进距离。 但是即使在使用timeIntervalSinceNow之后,位置caching也不会被删除。

 - (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) 

我使用一个计数器来计算UpdateUpLocation被调用的次数。
我只使用至less3个电话后收到的位置。

我知道3是一个神奇的数字,但我发现前3个电话caching或非常不准确。

看看这个问题的答案,因为它包含来自苹果示例应用程序“LocateMe”的代码,并提供了一些关于你正在做什么的更多细节:

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

你想在委托方法中检查新CLLocation对象的timestamp属性。 通过它的声音,只有在纬度/长度不超过XXX秒的感兴趣。

 NSTimeInterval timeInSeconds = [newLocation.timestamp timeIntervalSinceNow]; if (timeInSeconds > YOUR_CUSTOM_TIME_IN_SECONDS) { // Do something } 

我find了删除caching的答案。 didUpdateToLocation第一次被调用, newlocation获取caching值, 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; }