Какие функции обеспечивает генератор?

Я использую mogenerator какое-то время, и хотя существует разумное Руководство по началу работы и Stack Exchange в параметрах командной строки, я не нашел хорошего руководства для всех функций, которые он предоставляет. Короче говоря: что, помимо классов, которые предоставляет Core Data для вас, что генерирует mogenerator?

(Честно говоря, я продолжал находить небольшие приятные сюрпризы в заголовках/реализациях, которые я не понимал, были там, и я решил пройти через шаблоны и код могенератора и документировать, что я нашел в Stack Exchange Q & A. Однако мне бы хотелось увидеть дополнительные ответы и исправления.)

Ответы

Ответ 1

В дополнение к своей основной функции системы с двумя классами, mogenerator помогает вам автоматически внедрять ряд лучших практик в отношении основных данных в заголовках и файлах установки вашего компьютера.

Аксессоры по содержанию

Способы доступа к атрибутам ваших сущностей являются ядром того, что генерирует генератор. Но есть некоторые приятные функции, реализованные в аксессуарах выше и выше того, что предоставляет вам генератор класса Xcode.

Скалярные аксессоры

Встроенный генератор Xcode дает вам возможность "использовать скалярные свойства для примитивных типов данных". Эта опция дает вам выбор того, что Xcode создает свойства с NSTimeInterval вместо NSDate для типов даты, BOOL вместо NSNumber для булевых типов и int16_t (или аналогичных), а не NSNumber s.

Я нахожу это бешенством, потому что большую часть времени я предпочитаю примитивные типы, но не для NSDate, которые намного полезнее, чем a NSTimeInterval. Таким образом, Core Data предоставляет мне выбор объектов, и в этом случае я буду постоянно разбирать вещи и делать глупые ошибки, такие как if(myBooleanAttribute) (который всегда YES, потому что myBooleanAttribute - это NSNumber, а не BOOL). Или у меня могут быть скаляры, но в этом случае я получаю NSTimeInterval, что мне всегда нужно будет преобразовать в NSDate s. Или я могу вручную отредактировать все созданные файлы вручную, чтобы дать мне желаемое сочетание NSDate и BOOL s.

С другой стороны, movenerator предоставляет вам обе опции. Например, вы получите как myBooleanAttribute getter, который дает вам NSNumber (для удобства хранения в NSArray) и myBooleanAttributeValue getter, который дает вам фактический BOOL. То же самое с целыми числами и поплавками. (Mogenerator не генерирует NSTimeInterval accessors: только NSDate s.)

Типированные преобразуемые свойства

Если у вас есть свойство transformable, вы можете установить в атрибуте определенный ключ UserInfo (attributeValueClassName) в атрибуте, который будет указывать класс, который ваше свойство вернет/примет. (И он будет правильно перенаправлять объявление класса и т.д.). Единственное место, где я нашел это, было Verious.

Напротив, генератор кода Xcode будет вводить эти трансформируемые атрибуты только как типы идентификаторов.

Декларация о достоверности

В то время как mogenerator автоматически не генерирует какие-либо методы проверки, он включает в себя правильную подпись в качестве комментария в файле машины h. Похоже, что в основном это связано с историческими причинами, но это означает, что легко копировать и вставлять подпись, если вы решите реализовать ее в своей реализации в человеческом файле. (Я бы на самом деле не раскомментировал объявление, поскольку вы не должны напрямую ссылаться на валидацию.)

Примитивные аксессоры

Core Data уже предоставляет вам эти аксессоры к примитивным значениям, но по какой-то причине не включает их в свои заголовки с Xcode. Наличие mogenerator в их заголовочных файлах значительно облегчает доступ к примитивному значению.

Выбранные свойства

mogenerator будет генерировать аксессоры для выбранных свойств. Насколько я могу судить, не существует способа, чтобы генератор Xcode делал это.

Методы помощника

Автоматическое создание NSFetchedResultsController

Если у вас есть много отношений в вашем Entity, и вы передаете --template-var frc = true в mogenerator, mogenerator автоматически сгенерирует метод для создания запроса на выборку для дочерних объектов, связанных с родительским объектом. Он даже автоматически генерирует уникальное имя кеша и изолирует все внутри макроса препроцессора #if TARGET_OS_IPHONE.

Даже если это не соответствует вашим конкретным потребностям, это отличный пример того, как шаблоны могут быть расширены.

+ fetchMyFetchRequest: MOC _

Если вам нравится определять ваши запросы на выборку в модели, это намного лучший способ получить их, чем строковые строки.

-MyEntitySet

Mogenerator использует магию KVC, чтобы дать вам прокси-сервер NSMutableSet в ваших отношениях.

+ EntityName

Нужно указать имя объекта в NSFetchRequest или другой метод Core Data? Легко избежать строчных кодированных строк, используя этот простой метод, который возвращает имя объекта как NSString.

+ insertInManagedObjectContext: и entityInManagedObjectContext:

Другим способом избежать имен сурдокодирующих объектов является использование этих вспомогательных методов.

Идентифицированные идентификаторы объектов

Каждый из ваших заголовков и реализаций также включает класс MyEntityID. Это пустые интерфейсы и реализации, которые просто подклассифицируют класс NSManagedObjectID. Кроме того, каждый класс модели имеет вспомогательный метод, называемый objectID, который переопределяет стандартный метод objectID в NSManagedObject. Вспомогательный метод ничего не делает, кроме значения возвращаемого суперкласса для типа MyEntityID.

Конечный результат: компилятор может поймать ваши ошибки, если вы случайно меняете свои идентификаторы объектов из разных объектов.

Разное

Подклассификация пользовательского суперкласса

Один из параметров командной строки - --base-class:, который позволяет указать базовый класс, из которого будут наследованы все ваши сгенерированные классы. Это очень полезно, так что вы можете иметь базовый класс, в котором вы определяете удобные методы (которые, по данным Core Data, вы, вероятно, должны) или так, вы можете использовать набор инструментов Core Data с полкой, такой как SSDataKit (или оба).

includem

Простая мелочь, но если вы укажете аргумент -includem, mogenerator сгенерирует заголовочный файл, содержащий все файлы заголовков модели. Удобно, если вы хотите включить все ваши заголовки в PCH, или что-то еще в качестве стандартного заголовка.

Const Определения всех атрибутов, отношений, извлеченных свойств

Объявление extern структуры включено в заголовок, который имеет NSString, определенный для каждого атрибута и отношения, определенных в вашей Entity. Это позволяет вам определять предикаты и другие параметры, не выпекая имена ваших сущностей в ваши строки. Например,

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

(Этот тип структуры, используемый для констант с именами, описывается My Mike Ash на его блоге

const Определения пользовательских ключей/значений информации

Аналогично, декларация extern структуры определяется в заголовке, который включает в себя ключи как члены структуры, а значения - как значения. то есть.

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

Альтернативные шаблоны

Одна из интереснейших особенностей могенератора заключается в том, что в создании mogenerator его автор (Wolf Rentzsch) в основном построил родовой синтаксический анализатор и механизм шаблонов для файлов xcdatamodel, созданных Xcode. Поэтому вам не нужно использовать шаблоны mogenerator. Вы можете предоставить свой собственный простой аргумент командной строки. На сайте GitHub есть много пользовательских шаблонов.

Фактически, вам даже не нужно использовать Core Data. Многие из предоставленных шаблонов позволяют создавать серию обычных классов классов NSObject на основе модели данных. (Так называемые PONSO: "простые старые nsobjects" ). Хотите использовать модель данных в Xcode, но какой-то другой механизм сохранения? Могенератор может вам помочь.

Вам даже не нужно создавать объекты вообще: еще один интересный представленный шаблон просто предоставляет разницу двух разных версий модели.