objective c - infusion - Recepción de 2 notificaciones KVO para un solo cambio de KVC
kvo infusion (2)
Estas haciendo esto
- (void)setName:(NSString *)name
{
[self willChangeValueForKey:@"name"];
[contact setFirstName:name];
[self didChangeValueForKey:@"name"];
}
Pero (por los sonidos de la misma) de una subclase que no es NSManagedObject
. Esto significa que Cocoa intentará enviar notificaciones KVO automáticamente para usted. Estás complementando eso enviando el tuyo también. Soluciones:
- Reemplazar
+automaticallyNotifiesObserversForKey:
Notifica ObserversForKey+automaticallyNotifiesObserversForKey:
para devolverNO
Cambia tu método a:
- (void)setName:(NSString *)name { [contact setFirstName:name]; }
Estoy usando KVC / KVO para crear una implementación de enlaces personalizados para un proyecto de la Universidad (debe ser personalizado, ya que quiero hacer cosas más allá de lo que pueden hacer los enlaces, incluida la ejecución en iOS).
Tengo un ''controlador de enlaces'' que se registra para notificaciones KVO en una cantidad de claves en un objeto (usando addObserver: forKeyPath: options: context :) y recibo notificaciones. Sin embargo estoy recibiendo dos notificaciones por cada cambio. Tengo una idea para una solución alternativa, ¡pero preferiría averiguar por qué sucede esto y corregirlo!
¿Alguien tiene alguna idea de por qué esto podría estar sucediendo? Estoy seguro de que solo he registrado cada notificación una sola vez, y el desregistro de una sola vez hace que ambas notificaciones se detengan.
Gracias.
Editar:
Tengo una solicitud de algún código, así que lo pondré. Es un poco difícil en este momento, es esencialmente una prueba de concepto, así que tengan paciencia.
Esta es una de las propiedades que estoy observando (sé que es un poco extraño, pero esta clase esencialmente expone ciertas propiedades de un NSManagedObject como propiedades de sí mismo):
- (void)setName:(NSString *)name
{
[self willChangeValueForKey:@"name"];
[contact setFirstName:name];
[self didChangeValueForKey:@"name"];
}
Este es el código que uso para observar esa propiedad (confirmado para ejecutarse solo una vez, y solo en un solo lugar):
[viewModel addObserver:self
forKeyPath:@"name"
options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial)
context:viewController];
Cualquier llamada después de eso que cambie esa propiedad, por ejemplo:
viewModel.name = @"Joe";
[viewModel setName: @"Joe"];
[viewModel setValue: @"Joe" forKey: @"name"];
causará el método:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
para ser llamado dos veces, con los mismos argumentos cada vez.
Tal vez ponga un NSLog
en su llamada addObserver
, para ver si está agregando dos observadores.