2012-07-10 14 views
5

De forma predeterminada, cuando se crea un archivo de subclase NSManagedObject a partir del modelo de datos, Core Data crea propiedades de tipo NSString (no atómicas, retener) para columnas de tipo de cadena. Podría haber terminado debido a la consideración del rendimiento, sin embargo, estoy implementando el patrón Data Mapper donde las subclases NSManagedObject de datos centrales están separadas de las clases modelo. Por lo tanto, al convertir clases de modelo a la subclase NSManagedObject de datos principales, retener solo asigna un puntero y no una copia. Desde el punto de vista de la arquitectura, frena la separación lógica entre el acceso a los datos centrales y las clases de modelos, por lo que necesito usar copy en lugar de retener.¿Cómo hacer que las propiedades de NSString de NSManagedObject sean con "copiar" en lugar de "retener"?

¿Es la única forma de hacerlo manualmente cambiar las propiedades en las subclases NSManagedObject?

+0

En caso de que no tenga conocimiento de esto, el método 'copy' de un' NSString' normal (no mutable) devuelve la misma instancia, así que no se preocupe, su copia no copia nada cuando lo pruebes – Monolo

+0

Sí, estoy al tanto de eso, ya probado. "Copiar" copia únicamente los objetos de tipo mutable. Además, es interesante observar que la propiedad "copiar" también envía mensajes de copia a elementos NSArray, por lo que las cadenas mutables se copiarán si existen dentro de la matriz. – Centurion

+0

Por favor, eche un vistazo a mi comentario debajo de la respuesta. Hoy, traté de descubrir las propiedades prácticas de "copia". Entiendo cómo funcionan, simplemente nunca tuve la necesidad de utilizar NSMutableString, por lo que copiar en mi experiencia es redundante y solo para protección futura. – Centurion

Respuesta

4

La única forma de hacerlo es cambiar la declaración de la propiedad en una subclase NSManagedObject. Afortunadamente, Core Data maneja el resto automáticamente.

+0

Es muy probable que algunas entidades cambien en el esquema del modelo de datos del núcleo durante el proceso de desarrollo, por lo que la regeneración de NSManagedObjects sobrescribirá las propiedades editadas para "retener". Entonces, es un pequeño inconveniente. – Centurion

+0

Además, me gustaría compartir mis pensamientos sobre las propiedades de "copia". Las propiedades evitan que se cambie el valor de la propiedad NSMutableString desde el exterior. No hay NSNumber y NSDate mutables, por lo que "copiar" solo afecta a las cadenas. Sin embargo, de acuerdo con mi segundo año de desarrollo de aplicaciones iOS, nunca tuve la necesidad de utilizar NSMutableString, por lo que el caso de "copiar" es muy raro en mi humilde opinión. Apple anima a usar copias en propiedades NSString en sus ejemplos pero usa "retener" en arrays, diccionarios y conjuntos, aunque existe el mismo caso de sobreescritura (vea mi primer comentario debajo de la pregunta). Tipo de falta de una regla ... – Centurion

+1

@centurion try mogenerator. Separa tu código en la clase generada y una subclase de eso; puede editar la subclase sin sobrescribir los cambios. –

Cuestiones relacionadas