Променливата 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
You Rock :-) Благодаря! - person Bren; 23.03.2014