8

Tengo una entidad de datos centrales, "oferta", que tiene una relación con muchos "elementos", llamada "itemLink".Observación de claves dependientes en una relación múltiple

en IB, tengo un campo de texto vinculado a "total", y eso casi funciona.

En "bid.m" tengo:

- (NSDecimalNumber *)total 
{ 
    return [self valueForKeyPath:@"[email protected]"]; 
} 

también tengo:

+ (NSSet *)keyPathsForValuesAffectingTotal { 
    return [NSSet setWithObjects:@"itemLink", nil]; 

} 

al añadir o eliminar un elemento, actualizaciones "total" como se esperaba. Pero si cambia un "elemento" dentro del conjunto de itemLink, el total no se actualizará. ¿Cómo hace que KVO vea cuándo ha cambiado un objeto relacionado en el NSSet vinculado?

Gracias

Respuesta

7

Se ve su problema tiene que ver con el hecho de que sólo se menciona la keyPathsForValuesAffectingTotal keyPath "itemLink".

Dado que esa es la ruta de una relación a muchos, efectivamente le está diciendo a su objeto de oferta que observe un conjunto de cambios. Todo lo que hace un conjunto es administrar si los objetos son miembros de él o no. Eso explica por qué obtienes actualizaciones cuando se agregan o eliminan elementos de "itemLink", pero solo eso.

No solo le interesan los elementos que son miembros del conjunto, sino que también le interesan las propiedades (variables) de esos miembros, en este caso el precio. Por lo tanto, además de lo anterior, desea que cada miembro de "itemLink" notifique a todos los observadores de la tecla "total" del objeto de oferta relevante que el "precio" ha cambiado cada vez que cambia.

Desafortunadamente, no es tan simple como agregar "itemLink.price" como una ruta clave dependiente en su clase Bid, ya que KVO no le permite observar las relaciones "a través de" a-muchas.

Si usa una subclase NSManagedObject para instancias de su entidad Item, puede agregar esta funcionalidad manualmente. Omita + automaticallyNotifiesObserversForKey: en su Clase de artículo para indicarle a Cocoa que va a administrar las notificaciones de KVO manualmente para la clave de "precio", luego implemente su propio método setPrice: que envía la notificación correspondiente. Algo como esto:

- (void)setPrice:(id)inPrice 
{ 
    // bid = inverse relationship of itemLink 
    [[self valueForKey:@"bid"] willChangeValueForKey:@"total"]; 
    [self willChangeValueForKey:@"price"]; 

    [self setPrimitiveValue:inPrice forKey:@"price"]; 

    [self didChangeValueForKey:@"price"]; 
    [[self valueForKey:@"bid"] didChangeValueForKey:@"total"]; 
} 
Cuestiones relacionadas