Tengo una subclase personalizada NSManagedObject
, por ejemplo, Person
. También tengo un UIView
registrado con -addObserver:forKeyPath:options:context:
para observar varias propiedades de un Person
, algunas de las cuales son persistentes como "nombre" y otras son solo accesos tontos que cumplen con KVO sin relación con los datos centrales, como "beber".NSManagedObject y KVO contra la documentación
@interface Person : NSManagedObject
{
BOOL drinking;
}
@property (nonatomic, retain) NSString* name;
@property (nonatomic, readonly) BOOL drinking;
@end
@implementation Person
@dynamic name;
...
- (void) getDrunk {
[self willChangeValueForKey: @"drinking"];
drinking = YES;
[self didChangeValueForKey: @"drinking"];
}
...
@end
Todo funciona. Cada vez que envío -getDrunk
o establezco la propiedad name
, la vista recibe una notificación. Soy un hombre feliz, excepto cuando leí NSManagedObject
documentos que señalan:
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key
Hecho 1. SÍ si el receptor proporciona apoyo automático a la clave-valor observación de las notificaciones de cambio de clave, de lo contrario NO.
Hecho 2. La implementación predeterminada para NSManagedObject devuelve NO para las propiedades modeladas y YES para las propiedades no modificadas.
Ahora estoy tratando de analizar los dos hechos anteriores de los documentos. Verificar Fact 2 es fácil y la clase Person de hecho devuelve NO para @ "name" y YES para @ "drinking". Pero entonces, ¿cómo se notifica la vista cuando cambia el nombre? docs MVA dicen claramente,
El uso de notificaciones de observación automática, no es necesario para los cambios del soporte a una propiedad con invocaciones de willChangeValueForKey: y didChangeValueForKey: cuando la mutación de propiedades a través de sistema de no-valor y el valor clave de codificación métodos compatibles.
lo tanto, si la persona no devolvió a partir de +automaticallyNotifiesObserversForKey:
@ "nombre", parecería que tengo para envolver manualmente el nombre del compositor en will/didChangeValueForKey:
de MVA para trabajar. Sin embargo, KVO funciona muy bien. ¿Qué me estoy perdiendo? ¿Cuál es el punto en NSManagedObject
que anula +automaticallyNotifiesObserversForKey:
y lo documenta si no parece cambiar el comportamiento estándar de KVO?
Por favor, ayúdame a recuperar mi cordura.
Gran pregunta;) – Colas