2011-01-28 27 views
5

Tengo problemas para configurar una propiedad transitoria en Core Data. El problema que estoy tratando de resolver es: tengo una colección de objetos almacenados con éxito utilizando Core Data. Esta colección es esencialmente una colección de solo lectura pero, en tiempo de ejecución, quiero asociar otro objeto (un UIImage en este caso) con cada elemento de la colección. No necesito almacenar los UIImages; es puramente una asociación en tiempo de ejecución. Entonces, lo que realmente necesito es un 'marcador de posición' en cada objeto de la colección donde puedo soltar el UIImage más tarde.Datos básicos y propiedades transitorias

Un atributo transitoria parece que lo correcto y, para esto, documentos de referencia de Datos Básicos me dicen que debería establecer un "atributo opcional, transitoria de tipo indefinido" en el modelo de datos que he hecho: XCode snippet

Además, me dice que no necesito definir una propiedad correspondiente en el objeto de implementación, pero que tendré que escribir accesor personalizado & métodos setter. He modelado estos métodos basados ​​en los ejemplos en los documentos de la siguiente manera:

- (void)setDisplayImage:(UIImage *)anImage { 

    [self willChangeValueForKey:@"displayImage"]; 
    [self setPrimitiveValue:anImage forKey:@"displayImage"]; 
    [self didChangeValueForKey:@"displayImage"]; 
} 

y:

- (UIImage *)displayImage { 

    [self willAccessValueForKey:@"displayImage"]; 
    UIImage *anImage = [self primitiveDisplayImage]; 
    [self didAccessValueForKey:@"displayImage"]; 

    if (anImage == nil) {  
     NSData *displayImageData = [self displayImageData]; 
     if (displayImageData != nil) { 
      anImage = [NSKeyedUnarchiver unarchiveObjectWithData:displayImageData]; 
      [self setPrimitiveDisplayImage:anImage]; 
     } 
    } 
    return anImage; 
} 

También hay un método diferido "escritura" (willSave) que he escrito para el estricto completitud, aunque, como antes, nunca volveré a escribir estos objetos para almacenar.

El problema que estoy recibiendo es en los métodos primitiveDisplayImage y setPrimitiveDisplayImage de - (UIImage *) displayImage {. Básicamente, el compilador arroja advertencias sobre estos dos métodos ya que "el objeto X puede no responder a 'primitiveDisplayImage' ..." etc. Sin embargo, mi comprensión de los documentos es que estos accedores/setters primitivos se crean automáticamente, esto no parece sea ​​el caso. ¿Hay alguien por ahí que pueda ayudarme a resolver este problema? Muchas gracias

Respuesta

5

El problema con los métodos setPrimitive... es que aunque NSManagedObject responderá a ellos en tiempo de ejecución, el compilador no tiene manera de saber que existen. Puede suprimir los mensajes de advertencia declarando el método en el archivo de encabezado de su clase de entidad, usando una categoría para que el compilador no le grite por no definirlo en su implementación.

Otra opción es simplemente usar la llamada [self setPrimitiveValue:value forKey:@"key"]; para cada uno de los atributos que necesita acceder. He usado este método en el pasado, aunque acabo de notar en los documentos que esto se desaconseja en 10.5 y posteriores.

3

encontrado la respuesta aquí: Managed Object Accessor Methods

Básicamente: Declarar @propery en el archivo de cabecera de categoría, definen @dynamic en el archivo de implementación categoría.

Cuestiones relacionadas