NSKeyValueObserving не работает

Я написал CLLocationManager Singleton с именем LocationManager и хочу наблюдать за обновленным местоположением. Но наблюдательная часть не работает. Может кто-нибудь сказать мне, в чем проблема. Благодарю. Ниже приведены мои коды:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
if(object == self){
    if([keyPath isEqualToString:@"curStandardLocation"]){
        NSLog(@"current location is changed ....");
    }
}}(in LocationManager.m)

if([self.locationManager locationmanagerstatus]){
    [self.locationManager startLocationTracking];
    [[LocationManager sharedInstance] addObserver:self forKeyPath:@"curStandardLocation" options:NSKeyValueObservingOptionNew context:nil];} (in a separate viewcontroller where I need to listen to the location)

1 ответ

Если вы хотите отслеживать изменения местоположения, вы можете сделать это с

Создайте менеджера в нашем контроллере init метод:

_locationManager = [[CLLocationManager alloc] init];
[_locationManager setDelegate:self];
[_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[locationManager startUpdatingLocation];
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8) {
        [locationManager requestWhenInUseAuthorization];
    }

в viewWillAppear: метод, начать мониторинг изменения местоположения значения.

if ([CLLocationManager locationServicesEnabled]) {
    // Find the current location
    [self.locationManager startMonitoringSignificantLocationChanges];
    //rest of code...
}

Мониторинг значительных изменений хорош, потому что:

  • Он имеет более низкое энергопотребление, чем более частые типы обновлений.
  • "Значительные" изменения являются переменными, но намного меньше, чем несколько миль, использованных для запуска толчка.
  • Делегат будет вызываться, даже если приложение находится в фоновом режиме, позволяя использовать для постоянного обновления местоположения пользователя, даже если приложение не используется.

Вот два важных обратных вызова для реализации, locationManager:didUpdateLocations: а также locationManager:didFailWithError:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    // locations contains an array of recent locations, but this app only cares about the most recent
    // which is also "manager.location"
}

Также добавьте в свой info.plist

 <key>NSLocationUsageDescription</key>
 <string>The application require location services to work</string>
 <key>NSLocationAlwaysUsageDescription</key>
 <string>The application require location services to work</string>
 <key>NSLocationWhenInUseUsageDescription</key>
 <string>The application require location services to work</string>
Другие вопросы по тегам