2012-03-11 13 views
9

He configurado un esquema de datos básico simple, donde los objetos de los elementos se agregan a los objetos de la lista. Después de generar clases, los datos centrales han generado los accesos estándar, incluidas algunas maneras de agregar elementos a una lista (list.addItemsObjects y list.addItems :).Personalizar los accesores generados por datos centrales

También quiero agregar un NSDate 'fechaAdded' a cada elemento. Ahora, puedo configurarlo manualmente cada vez que creo un objeto, ya que los datos centrales me proporcionarán un descriptor Item.dateAdded. Pero realmente, preferiría que esto sea manejado por la propia lista, ya que la implementación nunca cambiará. Así que cada vez que llamo a list.AddItemObject, me gustaría configurar el atributo dateAdded del elemento al mismo tiempo. Supongo que también necesitaría hacer lo mismo en la inversa, para que item.setList también establezca la fechaAdded.

No estoy seguro de cómo hacer esto. ¿Debo tratar de redefinir los accesadores existentes generados por datos centrales? Si es así, ¿cómo hago esto? (¿Hay alguna manera de llamar a la implementación original dentro de mi código personalizado, de modo que se maneje la relación inversa y cualquier otra necesidad de datos básicos)? ¿O hay alguna forma mejor de personalizar estos métodos?

Respuesta

8

Puede anular los descriptores de acceso generados por los datos principales. Tiene que prestar atención a algunas cosas especiales como llamar al willChangeValueForKey y didChangeValueForKey, pero aparte de eso, anular los accesadores es prácticamente el mismo de siempre.

leer la documentación de Apple: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdAccessorMethods.html

Se explica claramente con una gran cantidad de ejemplos. Solo preste atención a la diferencia entre las relaciones de uno a uno y de uno a muchos.

No necesita implementar la funcionalidad inversa, esto es hecho por Core Data. Si llama al list.AddItem, entonces se llamará automáticamente a item.setList.

Así que solo agregue el código que desee en el acceso item.setList. De esta manera, usted garantiza que cada vez que se agrega un artículo a una lista, la fecha se actualiza en consecuencia. No te molestes con los accesadores de listas.

Su código sería algo así como:

- (void)setList:(List *)value 
{ 
    [self willChangeValueForKey:@"list"]; 
    [self setPrimitiveValue:[NSDate date] forKey:@"dateAdded"]; // use setValue:forKey: if you need KVO for dateAdded 
    [self setPrimitiveValue:value forKey:@"list"]; 
    [self didChangeValueForKey:@"list"]; 
} 

EDITAR le he dado otro pensamiento y es posible que desee saber lo siguiente:

Si personaliza los métodos de la lista (es decir, addItemObject), también deberá personalizar setItems. Además, si su artículo se agrega a una lista que no es la lista que personalizó, no se llamará a su código personalizado.

Por otro lado, si personaliza el método setList, el código es no llamado si no hay cambios para el artículo.

Por ejemplo, si se llama a

[list addItems:[NSSet setWithObject:item]]; 
[list addItemsObject:item]; 

continuación setList de acceso del elemento sólo se llama una vez! Las llamadas directamente a item.setList siempre se llaman, incluso si nada ha cambiado.

+0

Gracias. Lo he escaneado y lo estoy leyendo completamente ahora. Una parte que no veo mencionada: ¿debo aplicar las mismas personalizaciones a los usuarios de acceso inverso?Es decir, después de haber personalizado list.addItemObject, ¿debería también personalizar item.setList? –

+0

He actualizado mi respuesta para tu pregunta – JiaYow

+0

Gracias, esto fue suficiente para ponerme en marcha. Sin embargo, en lugar del setList más simple, agregué mis personalizaciones al inverso, list.addItemsObject (haciendo referencia a la documentación de to-many). Descubrí que no se llama cuando llamo a item.setList. –

Cuestiones relacionadas