3

所以,我有一个包含几个NSManagedObject类的应用程序,我想提取一些逻辑并将其放入一个自包含的框架中,以便在其他应用程序中使用。

我有一堂课,比如说:

Employee
 - firstName             (an MOM property)
 - lastName              (an MOM property)
 - (NSString *)fullName  (a method)
 - (NSUInteger)daysHired (an ObjC property)
 - etc...

我很想在一个框架中提供这个类,它是 MOM 的定义。我认为这可以通过在框架中添加 .mom、在其中定义 Employee、在框架中构建类的 .h 和 .m 来实现。当我想重用这个类时,我只需要将它包含到项目的构建中,将框架中的 .mom 与应用程序的 .mom 合并,实体将可用。我猜?

但是,我看不到如何从框架中获取实体 def/NSManagedObject 子类,然后在新应用程序中对其进行子类化或扩展。为了在我的应用程序NSManagedObjects和框架中的抽象实体之间建立关系,我必须对框架的实体进行子类化——我看不出如何将一个 MOM 文件中的实体与另一个 MOM 文件中的实体相关联,因为超类或作为关系的目的地。

想法?是否可以在框架中提供 MOM?

4

1 回答 1

4

确实,出于您所描述的原因,在编译的托管对象模型中扩展实体会相当尴尬。在我看来,您有几个选择,按方便的降序排列:

  • 包括未编译的.xcdatamodel而不是编译的.mom. 任何拥有编译模型的人都可以轻松地对其进行逆向工程,因此不会泄露任何额外信息。使用原始模型,可以像往常一样创建子实体。如果您担心现有实体的兼容性,请添加运行时检查以查看Employee并确保它看起来符合您的预期(例如,检查实体描述的versionHash)。如果更新了原始框架模型,则更改应该干净地合并——前提是您为模型使用 Xcode 4 和更高版本的文件格式。
  • 在代码中创建子实体。模型编辑器没有什么神奇之处,您在那里所做的一切也可以在代码中完成。通过创建和/或修改实例NSEntityDescription然后调用setEntities托管对象模型来首次加载模型时创建和/或修改实体。只需确保在加载持久存储之前这样做,因为在加载存储文件之后这样做会引发异常。
  • (最糟糕的是)在模型中创建一个通用的键值对存储实体类型,并赋予Employee实体类型与它的一对多关系。然后,您可以在运行时添加所需的任何键/值对,而无需创建新的子实体。

Core Data 在设计时并没有真正考虑到这种用途,但这并不意味着它不可能。我自己会选择第一个选项,但其他选项也可以。

于 2013-07-01T03:22:32.323 回答