cocoa core-data mogenerator

cocoa - ¿Qué características proporciona mogenerator?



core-data (1)

He estado usando mogenerator por un tiempo, y aunque hay una Guía de inicio y un artículo de Intercambio de pila en las opciones de la línea de comandos, no he encontrado una buena guía para todas las funciones que ofrece. En resumen: ¿qué, más allá de las clases que Core Data proporciona para usted, qué genera realmente Mogenerator?

(Francamente, seguí encontrando pequeñas sorpresas agradables en los encabezados / implementaciones que no sabía que estaban allí y decidí revisar las plantillas y el código del mogenerador y documentar lo que encontré en una sesión de preguntas y respuestas de Stack Exchange. Me encantaría. ver respuestas y ediciones adicionales, sin embargo.)


Además de su característica principal de un sistema de dos clases, mogenerator lo ayuda a implementar automáticamente una serie de mejores prácticas con respecto a los Datos del Núcleo en los archivos de implementación y encabezado de su máquina.

Accesores de propiedad

Los métodos para acceder a los atributos de sus Entidades son el núcleo de lo que genera mogenerator. Pero hay algunas características interesantes implementadas en los accesores que van más allá de lo que el generador de clases de Xcode listo para usar le brinda.

Accesorios escalares

El generador incorporado de Xcode le da la opción de "usar propiedades escalares para tipos de datos primitivos". Esta opción le da la opción de que Xcode cree propiedades con NSTimeInterval s en lugar de NSDate s para los tipos de fecha, BOOL s en lugar de NSNumber s para los tipos booleanos, e int16_t (o similar) en lugar de NSNumber s.

Lo encuentro irritante porque la mayoría de las veces prefiero los tipos primitivos, pero no para NSDate s, que son mucho más útiles que un NSTimeInterval . Así que Core Data me da la opción de los objetos, en cuyo caso constantemente desempaquetaré cosas y if(myBooleanAttribute) errores estúpidos como if(myBooleanAttribute) (que siempre es YES porque myBooleanAttribute es un NSNumber , no un BOOL ). O puedo tener escalas, pero en ese caso, obtengo NSTimeInterval s que siempre tendré que convertir a NSDate s. O puedo editar manualmente todos los archivos generados a mano para darme la combinación deseada de NSDate sy BOOL s.

Por otro lado, mogenerator te ofrece ambas opciones. Por ejemplo, obtendrás tanto un captador de myBooleanAttribute que te otorga un NSNumber (para facilitar el almacenamiento en un NSArray ) como un captador de myBooleanAttributeValue que te da un BOOL real. Lo mismo con enteros y flotadores. (Mogenerator no genera NSTimeInterval : solo NSDate s.)

Propiedades transformables mecanografiadas

Si tiene una propiedad transformable, puede establecer una clave de información de usuario específica (attributeValueClassName) en el atributo que especificará la clase que su propiedad devolverá / aceptará. (Y reenviará correctamente la clase, etc.) El único lugar donde encontré esto documentado fue en Verious .

En contraste, el generador de código Xcode solo escribirá estos atributos transformables como tipos de identificación.

Declaración de Validación

Si bien mogenerator no genera automáticamente ningún método de validación, sí incluye la firma adecuada como comentario en el archivo h de la máquina. Parece ser en gran parte por razones históricas, pero significa que es fácil copiar y pegar la firma si decide implementarla en su implementación de archivo humano. (En realidad, no descomentaría la declaración, ya que no se supone que debe llamar directamente a la validación).

Accesores primitivos

Core Data ya le proporciona estos accesores a los valores primitivos, pero por alguna razón no los incluye en sus encabezados generados por Xcode. Si mogenerator los incluye en sus archivos de encabezado, es mucho más fácil acceder a un valor primitivo.

Propiedades Fetched

mogenerator generará accesores para las propiedades buscadas. Por lo que puedo decir, no hay manera de que el generador Xcode haga esto.

Métodos de ayuda

Generación automática del controlador de NSFetchedResults

Si tiene una relación de muchos en su Entidad y pasa --template-var frc = true a mogenerator, mogenerator generará automáticamente un método para crear una solicitud de recuperación para los objetos secundarios asociados con un objeto primario. Incluso genera automáticamente un nombre de caché único, y aísla todo dentro de una macro preprocesadora #if TARGET_OS_IPHONE .

Incluso si esto no se ajusta a sus necesidades particulares, es un gran ejemplo de cómo se pueden extender las plantillas.

+ fetchMyFetchRequest: moc_

Si le gusta definir sus solicitudes de recuperación en el modelo, esta es una forma mucho mejor de recuperarlas que las cadenas codificadas.

-MyEntitySet

Mogenerator utiliza la magia de KVC para brindarle un proxy NSMutableSet en sus relaciones.

+ nombre de entidad

¿Necesita proporcionar un nombre de entidad a un NSFetchRequest u otro método de Core Data? Es fácil evitar cadenas codificadas mediante el uso de este método simple que devuelve el nombre de la entidad como una NSString .

+ insertInManagedObjectContext: y entityInManagedObjectContext:

Otra forma de evitar los nombres de las entidades codificadas es usar estos métodos de ayuda.

ID de objetos escritos

Cada uno de sus encabezados e implementaciones también incluye una clase MyEntityID . Son interfaces e implementaciones vacías que simplemente subclasifican la clase NSManagedObjectID . Además, cada clase de modelo tiene un método auxiliar llamado objectID que reemplaza el método estándar objectID en NSManagedObject . El método auxiliar no hace nada más que convertir el valor de retorno de la MyEntityID tipo MyEntityID .

El resultado neto: el compilador puede detectar sus errores si alguna vez intercambia accidentalmente sus ID de objeto de diferentes entidades.

Diverso

Subclasificando una Superclase personalizada

Una de las opciones de la línea de comando es --base-class: que le permite especificar una clase base de la cual todas las clases generadas heredarán. Esto es muy útil, ya sea para que pueda tener una clase base donde defina métodos convenientes (que, dados los Datos básicos, probablemente debería) o para que pueda usar un kit de herramientas de Datos básicos como SSDataKit (o ambos).

incluido

Una pequeña cosa simple, pero si especifica un argumento --includem, mogenerator generará un archivo de encabezado que incluye todos los archivos de encabezado de su modelo. Conveniente si desea incluir todos sus encabezados en un PCH, o algo más que otro encabezado estándar que incluya.

Const Definiciones de todos los atributos, relaciones, propiedades de captura

Se incluye una declaración externa de una estructura en el encabezado que tiene un NSString definido para cada atributo y relación definidos en su Entidad. Esto le permite definir predicados y otros parámetros, sin incluir los nombres de sus entidades en sus cadenas. Por ejemplo,

req.predicate = [NSPredicate predicateWithFormat: @"(%K == YES) AND (%K <= %@)",MyObject.favorite, MyObject.availableDate, [NSDate date]];

(Este tipo de estructura utilizada para las constantes de "espacio de nombre" se describe a My Mike Ash en su blog

Definiciones constantes de claves / valores de información del usuario

De manera similar, una declaración externa de una estructura se define en el encabezado que incluye las claves como miembros de la estructura y los valores como valores. es decir

NSLog(@"User info for key my key is %@",MyObjectInfo.mykey) //will log "myvalue"

Plantillas alternativas

Una de las cosas interesantes de mogenerator es que en la creación de mogenerator, su autor (Wolf Rentzsch) básicamente ha creado un analizador genérico y un motor de plantillas para los archivos xcdatamodel producidos por Xcode. Por lo tanto, no es necesario utilizar las plantillas de mogenerator. Puede proporcionar su propio argumento de línea de comando simple. Hay muchas plantillas contribuidas por el usuario en el sitio de GitHub.

De hecho, ni siquiera tiene que usar Core Data. Muchas de las plantillas contribuidas le permiten generar una serie de clases de modelo NSObject ordinarias basadas en el modelo de datos. (Llamados PONSOs: "nsobjects llanos viejos"). ¿Quieres usar el modelador de datos en Xcode, pero algún otro mecanismo de persistencia? mogenerator puede ayudarte allí.

Ni siquiera necesita generar objetos en absoluto: otra plantilla enviada interesante solo proporciona una diferencia de dos versiones de modelo diferentes.