Apple и другие в Интернете рекомендуют вам получить скорость, используя Core Location через метод делегата didUpdateLocations
, используя некоторую версию:
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
CLLocation *updatelocation = locations.lastObject;
double speed = updatelocation.speed;
speed = speed * 1.94384; //converting speed from m/s to knots(unit)
NSLog(@"Speed %f",speed);
}
Однако, чтобы сэкономить энергию, Apple также рекомендует вызывать stopUpdatingLocations в методе didUpdate:
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
// Get a fix on the user's location
...
// Stop location updates
self.locationManager.stopUpdatingLocation()
}
Я обнаружил, что когда я вызываю stopUpdatingLocations, скорость часто застревает на нуле, поэтому она всегда показывает ноль.Если я уберу строку stopUpdating
, скорость будет работать правильно.Похоже, что для получения точной скорости требуется более одного наблюдения или, по крайней мере, немедленный вызов stopUpdatingLocations
в методе не позволяет получить надежные показания скорости.
Приложение не всегда должно знать скорость.Это просто должно предоставить точное чтение, когда пользователь запрашивает его.
Может ли кто-нибудь предложить рабочий подход, обеспечивающий точное считывание скорости при приемлемом уровне энергопотребления?