2010-02-02 15 views
6

He estado usando atributos transformables en datos básicos para transformar objetos complejos como imágenes y colores en datos sin formato. Tomé this ...iPhone Core Data: ¿Los atributos transformables deben transformarse solo en los datos?

La idea detrás de atributos transformables es que tiene acceso a un atributo como un tipo no estándar, pero detrás de las escenas de Datos Básicos utiliza una instancia de NSValueTransformer a convertir el atributo hacia y desde una instancia de NSData. Core Data luego almacena la instancia de datos en el almacén persistente .

... para que solo pueda convertir datos hacia y desde datos y no uno de los otros tipos de atributos como cadenas.

Se me ocurrió que este podría no ser el caso. La documentación podría estar hablando del caso más común. IIRC, en enlaces Cocoa, las transformaciones pueden ser en gran medida arbitrarias. Es posible transformar, por ejemplo, un NSURL en un NSString para visualizarlo y luego invertirlo.

Antes de perder el tiempo experimentando y posiblemente obtener un resultado confuso, me preguntaba si alguien sabía con certeza si la transformación solo se realiza desde y hacia datos solamente.

Respuesta

4

Correcto. Debe transformar su atributo en un objeto NSData. Debería serializar un NSURL a NSData - y el transformador predeterminado NSKeyedUnarchiveFromDataTransformerName lo hará por usted.

Otro enfoque, y el que uso para las URL, es mantener dos propiedades paralelas. Una propiedad transitoria de tipo indefinido para la URL y una segunda propiedad persistente de tipo de cadena para la tienda de respaldo. Construyo la URL de la cadena la primera vez que se solicita, y actualizo la propiedad de la cadena cada vez que se cambia la URL.

No hay forma de aplicarlo, pero realmente no desea usar la propiedad de cadena desde fuera de la clase de su entidad. En general, hago que la definición @property del atributo de cadena sea privada para recordarme que no debo usarla.

+0

Sí, he estado usando el mismo enfoque por algún tiempo, solo quería comprobar que no había entendido mal algo. – TechZen

+2

Pero el documento oficial muestra un ejemplo de fragmento de código use '+ (Clase) transformValueClass {return [NSString class]; } ', parece que' NSValueTransformer' se puede transformar en 'NSString' .. Estoy totalmente confundido ..: S – Kjuly

+0

Oh..year de 10 ... – Kjuly

0

No tengo suficientes puntos para comentar, así que tengo que contribuir en forma de respuesta. Intenté hacer exactamente lo que @Amaud sugirió, utilizando un NSValueTransformer para convertir objetos NSURL en NSString objetos para un atributo Transformable. Desafortunadamente, Core Data todavía espera una instancia NSData del transformador, independientemente del transformedValueClass. Core Data aún crea la base de datos SQLite con una columna BLOB para ese atributo transformable, y al guardar entidades da como resultado un bloqueo con uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString bytes]: unrecognized selector sent to instance 0x608000075bc0'. Core Data está intentando invocar [NSData bytes] en la instancia NSString proporcionada por mi transformador. Esto me parece un gran agujero en Core Data, ya que estoy seguro de que hay innumerables tipos no estándar que podrían almacenarse y consultarse como atributos de cadena.

Parece que la única opción, aparte de usar NSString, es hacer como @Alex describe y usa propiedades transitorias y valores derivados. Sin embargo, Core Data no lo hace muy limpio porque, como dijo @Alex, no hay forma de imponer el uso exclusivo de los accessors de propiedades transitorias.

Cuestiones relacionadas