Переменная CLLocation не отправляет KVO — NSKeyValueObservingOptionNew

Я работаю над простым приложением, которое собирает текущие данные пользователей в модели местоположения. Это работает, и я могу регистрировать местоположения. Однако ни один viewController не видит обновленную переменную. Я использую KVO в viewControllers для запуска, но кажется, что CLLocation не отправляет с использованием «NSKeyValueObservingOptionNew». Он сработает, если я использую «NSKeyValueObservingOptionInitial», но это сработает до того, как CLLocationManager получит возможность установить экземпляр.

Кто-нибудь знает, почему CLLocation не отправляет значение «... New»? Как я уже сказал, он работает только тогда, когда он установлен в состояние «... Начальное».

Мысли?

Посмотреть код контроллера:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

    if ([keyPath isEqual:@"locationUpdated"]) {

        CLLocation *locationVariable = [[CLLocation alloc]init];
        locationVariable = self.location.currentLocation;
        NSLog(@"the location vaiable: %@", locationVariable);
        self.theMap.centerCoordinate = self.location.currentLocation.coordinate;

    }
}

Код модели местоположения:

- (void)startLocationManger {

    if ([self locationManager] == nil) self.locationManager = [[CLLocationManager alloc] init];
        _locationManager.delegate = self;
        _locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [_locationManager startUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {

    CLLocation *locationFix = [locations lastObject];
    _currentLocation = locationFix;
    NSLog(@"Current Location: %@", _currentLocation);

}

person Bren    schedule 22.03.2014    source источник


Ответы (1)


Основная причина, по которой уведомление KVO не срабатывает из кода модели местоположения, вероятно, заключается в этой строке в методе делегата locationManager:didUpdateLocations:

_currentLocation = locationFix;

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

Автоматические уведомления KVO срабатывают, только если вы используете синтезированный установщик свойств:

self.currentLocation = locationFix;  // <-- assign using self.xxx


Немного не связанно, но в методе observeValueForKeyPath:

  1. Я не понимаю, почему вы проверяете if ([keyPath isEqual:@"locationUpdated"]). Вы уверены, что хотите найти keyPath?
  2. В этом коде:

    CLLocation *locationVariable = [[CLLocation alloc]init];
    locationVariable = self.location.currentLocation;
    

    alloc+init не нужен, так как переменной сразу же присваивается новое значение. Просто сделать:

    CLLocation *locationVariable = self.location.currentLocation;
    
person Community    schedule 22.03.2014
comment
Спасибо за замечание... Я изменил по вашей рекомендации, но все равно ничего. KeyPath устанавливается с помощью связывающего вызова '[self.location addObserver:self forKeyPath:@locationUpdated options:NSKeyValueObservingOptionNew context:NULL];' И я почистил код (спасибо). Любые другие мысли? - person Bren; 22.03.2014
comment
В контроллере представления попробуйте сделать addObserver следующим образом: [self addObserver:self forKeyPath:@"self.location.currentLocation" options:NSKeyValueObservingOptionNew context:NULL]; и временно убрать проверку значения keyPath вObservValueForKeyPath. - person ; 23.03.2014
comment
Ты молодец :-) Спасибо! - person Bren; 23.03.2014