发电机提供哪些功能?

时间:2014-03-21 17:56:19

标签: cocoa core-data mogenerator

我现在已经使用了mogenerator一段时间了,虽然命令行选项上有一个合理的Getting Started GuideStack Exchange article,但我找不到好的指南它提供的所有功能。 简而言之:除了Core Data为您提供的类之外,mogenerator实际生成了什么?

(坦率地说,我一直在标题/实现中找到一些令人惊喜的惊喜,我没有意识到它们在那里,我决定逐步完成生成器模板和代码并记录我在Stack Exchange Q& S中发现的内容。答:我很乐意看到其他答案和编辑。)

1 个答案:

答案 0 :(得分:38)

除了两级系统的核心功能外,mogenerator还可以帮助您在机器标题和实现文件中自动实施有关Core Data的大量最佳实践。

属性访问者

访问实体属性的方法是mogenerator生成的核心。但是,除了开箱即用的Xcode类生成器之外,访问器中还实现了一些很好的功能。

标量访问者

Xcode的内置生成器为您提供了选项"对原始数据类型使用标量属性"。此选项允许您选择让Xcode创建属性NSTimeInterval而不是NSDate s用于日期类型,BOOL s而不是NSNumber s用于布尔类型,以及{{ 1}}(或类似的)而不是int16_t s。

我发现这令人愤怒,因为大多数时候我更喜欢原始类型,但不适用于NSNumber,它比NSDate更有用。因此,核心数据给了我对象的选择,在这种情况下,我将不断取消装箱并犯下愚蠢的错误,例如NSTimeInterval(总是if(myBooleanAttribute),因为YES是{{1} },而不是myBooleanAttribute)。或者我可以有标量,但在这种情况下,我得到NSNumber s,我总是必须转换为BOOL s。或者我可以手动编辑所有生成的文件,以便为我提供NSTimeIntervalNSDate s的所需组合。

另一方面,mogenerator为您提供了两种选择。例如,您将获得一个NSDate获取器,它为您提供BOOL(以便在myBooleanAttribute中轻松存储)和NSNumber获取器,为您提供实际的NSArray 1}}。与整数和浮点数相同。 (Mogenerator不生成myBooleanAttributeValue个访问者:仅BOOL s。)

键入的可转换属性

如果您有可转换属性,则可以在属性中设置特定的UserInfo键(attributeValueClassName),该键将指定您的属性将返回/接受的类。 (并且它会正确地向前宣布课程等。)我发现这个文件的唯一地方是Verious

相比之下,Xcode代码生成器只会将这些可转换属性键入为id类型。

验证声明

虽然mogenerator不会自动生成任何验证方法,但它确实包含正确的签名作为机器h文件中的注释。这似乎主要是出于历史原因,但它确实意味着如果您决定在人类文件实现中实现它,则很容易复制和粘贴签名。 (我不会实际取消对声明的注释,因为你不应该直接调用验证。)

原始访问者

核心数据已经为您提供了原始值的这些访问者,但由于某些原因,它们不会将它们包含在其Xcode生成的头文件中。让mogenerator将它们包含在头文件中可以更容易地访问原始值。

获取属性

mogenerator将为获取的属性生成访问器。据我所知,没有办法让Xcode生成器这样做。

助手方法

自动NSFetchedResultsController生成

如果您的实体中有多对多关系,并且将--template-var frc = true传递给mogenerator,则mogenerator将自动生成一个方法,以便为与父对象关联的子对象创建获取请求。它甚至可以自动生成唯一的缓存名称,并隔离NSTimeInterval预处理器宏中的所有内容。

即使这不符合您的特定需求,也是如何扩展模板的一个很好的例子。

+ fetchMyFetchRequest:MOC _

如果您想在模型中定义获取请求,那么检索它们比硬编码字符串要好得多。

-MyEntitySet

Mogenerator利用KVC的魔力为您的关系提供NSDate代理。

+的entityName

需要为#if TARGET_OS_IPHONE或其他核心数据方法提供实体名称吗?通过使用将实体名称作为NSMutableSet返回的简单方法,可以轻松避免硬编码字符串。

+ insertInManagedObjectContext:和entityInManagedObjectContext:

避免硬编码实体名称的另一种方法是使用这些辅助方法。

键入的对象ID

您的每个标头和实现还包含一个NSFetchRequest类。它们是空接口和实现,仅仅是NSString类的子类。此外,每个模型类都有一个名为objectID的辅助方法,它覆盖MyEntityID中的标准objectID方法。辅助方法除了将超类的返回值强制转换为NSManagedObjectID类型外,什么都不做。

最终结果:如果您不小心将对象ID与不同实体交换,编译器可以捕获您的错误。

对自定义超类进行子类化

其中一个命令行选项是NSManagedObject,它允许您指定所有生成的类将从中继承的基类。这非常有用,要么你可以有一个基类来定义方便方法(给定Core Data,你可能应该这样),或者你可以使用现成的Core Data工具包,比如SSDataKit(或两者)。 / p>

includem

一个简单的小东西,但如果你指定一个--includem参数,mogenerator将生成一个包含所有模型头文件的头文件。如果您想将所有标题包含在PCH中,或者包含其他标准标题,则非常方便。

所有属性,关系,获取属性的Const定义

标头中包含一个结构的extern声明,其中为您的实体中定义的每个属性和关系定义了MyEntityID。这允许您定义谓词和其他参数,而无需将实体名称烘焙到字符串中。例如,

--base-class:

(这种类型的结构用于"名称空间"常量在his blog

上描述了My Mike Ash

const用户信息键/值的定义

类似地,在头文件中定义了一个结构的extern声明,其中包含作为结构成员的键,以及作为值的值。即。

NSString

备用模板

关于mogenerator的一个有趣的事情是,在构建mogenerator时,它的作者(Wolf Rentzsch)基本上为Xcode生成的xcdatamodel文件构建了一个通用的解析器和模板引擎。因此,您不需要使用生成器模板。您可以使用简单的命令行参数提供自己的参数。 GitHub网站上有很多user contributed templates

事实上,您甚至不必使用核心数据。许多提供的模板允许您基于数据模型生成一系列普通的NSObject模型类。 (所谓的PONSO:"普通的旧对象")。想在Xcode中使用数据建模器,还有其他一些持久性机制?发电机可以帮助你。

您根本不需要生成对象:another interesting submitted template只提供两种不同模型版本的差异。