【问题标题】:Core Data: Where to put awakeFromFetch and awakeFromInsert?核心数据:awakeFromFetch 和 awakeFromInsert 放在哪里?
【发布时间】:2012-11-05 09:58:09
【问题描述】:

我想覆盖awakeFromFetchawakeFromInsert

当我保持自动生成的NSManagedObject 子类不变并将我的自定义代码分类时,我的问题是:

我应该将awakeFromFetchawakeFromInsert 放在哪里才能正确调用这些方法?

【问题讨论】:

    标签: objective-c ios core-data nsmanagedobject objective-c-category


    【解决方案1】:

    如果你的托管对象子类文件是由Xcode生成的,那么你也可以把方法放在托管对象子类的一个类别中,这样你在Xcode中重新生成类文件时代码不会被覆盖。

    MyEntity+Extensions.h

    #import "MyEntity.h"
    
    @interface MyEntity (Extensions)
    @end
    

    MyEntity+Extensions.m

    #import "MyEntity+Extensions.h"
    
    @implementation MyEntity (Extensions)
    
    - (void)awakeFromFetch
    {
    
    } 
    
    - (void)awakeFromInsert
    {
    
    }
    @end
    

    【讨论】:

    • 好的!我不知道我可以覆盖自定义类别中的方法。
    • @AlexR:我已经用prepareForDeletion 完成了它并且它有效。
    • @AlexR:另见this link:“当一个类别覆盖一个继承的方法时,新版本可以像往常一样,通过一条消息将继承的版本合并到超级......”所以有在MyEntity 的类别中覆盖NSManagedObject 的继承方法是没有问题的。
    • 这意味着 Core Data 在所有现有类别中搜索 NSManagedObject 以查找覆盖方法,如果找到则使用覆盖方法?但是,如果存在多个方法,Core Data 将如何对这些方法进行优先级排序?
    • @AlexR:如果多个类别实现相同的方法,那么您无法预测调用哪个类别,所以这绝对不是一个好主意。 - 在我的代码中,每个托管对象子类只有一个类别,其中包含来自NSManagedObject 的所有自定义方法和覆盖方法。
    【解决方案2】:

    您可能还想考虑mogenerator。它是一个命令行工具,可为您的每个托管对象生成两个类,并确保您的自定义代码在您的模型更改时不会被覆盖。

    【讨论】:

    • 发电机就是炸弹。
    【解决方案3】:

    根据 NSManagedObject 类引用,你应该把它放在一个子类中——调用超级实现是必要的:

    重要提示:子类必须在执行自己的初始化之前调用 super 的实现。

    【讨论】:

      【解决方案4】:

      你必须在你的子类中实现它们。如果所有子类的代码都相同,并且您希望避免将它们复制粘贴到每个子类中,我建议编写一个实现它们的NSManagedObject 子类,然后将您的特定实体类作为该子类的子类类。

      //MyManagedObject.h
      @interface MyManagedObject : NSManagedObject
      //...
      @end
      
      //MyManagedObject.m
      @implementation
      - (void)awakeFromFetch
      {
          //...
      } 
      - (void)awakeFromInsert
      {
          //...
      }
      @end
      
      
      //OneOfMyEntities.h
      @interface OneOfMyEntities : MyManagedObject
      //...
      

      【讨论】:

        【解决方案5】:

        我觉得做一个扩展是比子类更好的选择,因为在子类中你需要在生成时再次更改父类...我希望这是更好的方法....

        【讨论】:

        • 如果父类的名字保持不变,为什么还要在子类中更改父类?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-02
        • 1970-01-01
        相关资源
        最近更新 更多