Недавно я решил эту проблему и обнаружил, , наконец, умело прочитав документацию , что CoreLocation запускается в отдельном потоке, так что вы можете запустить его и затем получать события по мере его обновления. Он находится в документации под рубрикой «Получение местоположения пользователя» . Итак, вот где вы начинаете обновление:
- (void)startStandardUpdates
{
if (nil == locationManager)
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.distanceFilter = none;
[locationManager startUpdatingLocation];
}
Если вы сделаете делегата "self", он будет отправлять события в тот же класс, где определен метод start, поэтому вам просто нужно добавить следующее для извлечения событий:
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
if (newLocation.horizontalAccuracy < 30.0)
{
NSLog(@"latitude %+.6f, longitude %+.6f\n",
newLocation.coordinate.latitude,
newLocation.coordinate.longitude);
[manager stopUpdatingLocation];
}
}
Таким образом, он будет продолжать получать события, а затем выключать приемник GPS для экономии энергии. Конечно, для этого нужно время и какой-то способ сохранить и принять местоположение с наилучшей горизонтальной точностью, если оно истекло, но я пока не выяснил, как это сделать.