2010-09-16 11 views
18

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.

+2

Gran pregunta;) – Colas

Respuesta

16

Bueno, NSManagedObject proporciona una implementación para la propiedad name (así como los métodos - name y - setName:). Supongo que las implementaciones proporcionadas por Core Data incluyen llamadas a willChangeValueForKey: y didChangeValueForKey:.

Por lo tanto, aunque el MVA es "automática" en el sentido de que usted no tiene que hacer nada para que funcione, me imagino que es no automático en el sentido de que willChangeValueForKey: y didChangeValueForKey: están siendo llamados por los métodos en NSManagedObject que proporcionan las implementaciones de propiedades dinámicas.

+2

Su explicación tiene sentido. ¡Muchas gracias! – Costique

Cuestiones relacionadas