cocoa core-data key-value-observing nsmanagedobject

cocoa - NSManagedObject y KVO vs Documentation



core-data key-value-observing (1)

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

Entonces, aunque el KVO es "automático" en el sentido de que no tuvo que hacer nada para que funcionara, me imagino que no es automático en el sentido de que willChangeValueForKey: y didChangeValueForKey: están siendo llamados por los métodos de NSManagedObject que proporciona las implementaciones de propiedades dinámicas.

Tengo una subclase NSManagedObject personalizada, por ejemplo, Person . También tengo una UIView registrada con -addObserver:forKeyPath:options:context: para observar varias propiedades de una Person , algunas de las cuales son persistentes como "nombre" y otras son simples personas tontas que cumplen con los requisitos de KVO que no están relacionadas con los Datos básicos, como "beber ".

@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 configuro la propiedad del name , la vista se notifica. Soy un hombre feliz, excepto cuando leí los documentos de NSManagedObject que dicen:

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key

Hecho 1. SÍ, si el receptor proporciona soporte automático para las notificaciones de cambios de observación del valor clave para la clave, de lo contrario NO.

Hecho 2. La implementación predeterminada para NSManagedObject devuelve NO para las propiedades modeladas, y YES para las propiedades sin modelar.

Ahora estoy tratando de analizar los dos hechos anteriores de los documentos. Verificar el hecho 2 es fácil y la persona de clase devuelve NO para @ "nombre" y SÍ para @ "beber". Pero entonces, ¿cómo se notifica a la vista cuando cambia el nombre? KVO docs dice claramente,

Al usar las notificaciones automáticas del observador, no es necesario encerrar los cambios en una propiedad con invocaciones de willChangeValueForKey: y didChangeValueForKey: al mutar propiedades a través de la codificación de clave-valor y los métodos compatibles de codificación de clave-valor.

Por lo tanto, si Person devuelve NO de +automaticallyNotifiesObserversForKey: will/didChangeValueForKey: ObserversForKey +automaticallyNotifiesObserversForKey: para @ "nombre", parece que tengo que ajustar manualmente el will/didChangeValueForKey: nombres en will/didChangeValueForKey: para que KVO funcione. Sin embargo, KVO funciona bien . ¿Qué me estoy perdiendo? ¿Cuál es el punto en la NSManagedObject de NSManagedObject +automaticallyNotifiesObserversForKey: NSManagedObject +automaticallyNotifiesObserversForKey: y lo documenta si parece que no cambia el comportamiento estándar de KVO?

Por favor, ayúdame a recuperar mi cordura.