【问题标题】:Core Data and Private Frameworks核心数据和私有框架
【发布时间】:2013-06-21 19:30:30
【问题描述】:

所以,我有一个包含多个 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?

【问题讨论】:

    标签: ios cocoa core-data cocoa-design-patterns


    【解决方案1】:

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

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

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

    【讨论】:

    • ...如果这还不足以“接受”并授予全部赏金,最好能说明原因。
    • 厚脸皮哈哈哈。顺便说一句,答案很好。
    • 很抱歉。我可能会做第二件事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 2020-05-10
    • 2012-04-14
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多