icon buttons ios core-data key-value-observing

ios - buttons - ionic icon



¿Por qué KVO envía una notificación de cambio cuando los valores nuevos y antiguos son los mismos? (1)

Tengo una entidad que es una subclase de NSManagedObject llamada Evento. También he registrado algunos atributos modelados de esta entidad para las notificaciones de cambio de KVO:

[self.event addObserver:self forKeyPath:@"numGuests" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:&numGuestsContext]; [self.event addObserver:self forKeyPath:@"checkedIn" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:&checkedInContext]; [self.event addObserver:self forKeyPath:@"seatedCount" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:&seatedContext];

Sin embargo, parece que la notificación del método observeValueForKeyPath se está desencadenando aunque el valor de NSKeyValueChangeOldKey y NSKeyValueChangeNewKey en el diccionario de cambio sea el mismo?

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { NSNumber *oldValue = [change valueForKey:NSKeyValueChangeOldKey]; NSNumber *newValue = [change valueForKey:NSKeyValueChangeNewKey]; if ([oldValue isEqualToNumber:newValue]) { return; }

Por ahora, he recurrido a hacer un rápido chequeo de la cordura para ver si son iguales, pero me gustaría entender por qué esta notificación es despedida para empezar.

ACTUALIZACIÓN : @jszumski mencionó en los comentarios que esto probablemente está sucediendo porque los objetos son diferentes aunque lógicamente iguales. El objeto de la entidad Evento siempre tiene la misma dirección; sin embargo, el objeto que estoy observando, que es un atributo dentro de la entidad, sigue cambiando de dirección, aunque no estoy seguro de por qué.

Me pregunto si el acceso a este valor en un hilo de consulta bg podría hacer que Core Data cree nuevos objetos internos dentro de la entidad con el mismo valor.


Simplemente, está asumiendo la funcionalidad de NSKeyValueObservingOptions . No funcionan como esperas que lo hagan. Las banderas que envía solo deciden cuáles son los contenidos del diccionario de cambio . El observador siempre se dispara cada vez que se llama a los setters.

Además, cuando envías banderas antiguas y nuevas , realmente solo dice "Me gustaría el valor anterior y el nuevo valor. No me importa si son iguales o no".

Por favor, lea la referencia para obtener más información:

NSKeyValueObservingOptions

Estas constantes se pasan a addObserver: forKeyPath: options: context: y determina los valores que se devuelven como parte del diccionario de cambio pasado a un observeValueForKeyPath: ofObject: change: context :. Puede pasar 0 si no necesita cambiar los valores del diccionario.