NSManagedObject 子类的自定义初始化

Posted

技术标签:

【中文标题】NSManagedObject 子类的自定义初始化【英文标题】:Custom init for a NSManagedObject subclass 【发布时间】:2012-08-29 13:50:56 【问题描述】:

如何为NSManagedObject 子类编写自定义init?例如,我想要initItemWithName:Volume: 之类的东西。其中Item 是具有两个属性namevolumeNSManagedObject 子类。

【问题讨论】:

看看下面的问题***.com/questions/10489578/…。我可能会帮助你。 @NenadMihajlovic +1。好评论! 【参考方案1】:

卡洛斯,

按照 Nenad Mihajlovic 的建议,您可以为此创建一个类别。

因此,例如,如果您有一个 Item 类,您可以创建一个名为 Item+Management 的类别并将创建代码放在那里。在这里你可以找到一个简单的例子。

// .h

@interface Item (Management)

+ (Item*)itemWithName:(NSString *)theName volume:(NSNumber*)theVolume inManagedObjectContext:(NSManagedObjectContext *)context;

@end

// .m

+ (Item*)itemWithName:(NSString *)theName volume:(NSNumber*)theVolume inManagedObjectContext:(NSManagedObjectContext *)context

    Item* item = (Item*)[NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext:context];
    theItem.name = theName;
    theItem.volume = theVolume;

    return item;

当你想创建一个新项目时,做一个像这样的导入

#import "Item+Management.h"

并像这样使用

Item* item = [Item itemWithName:@"test" volume:[NSNumber numberWithInt:10] inManagedObjectContext:yourContext];
// do what you want with item...

这种方法非常灵活,在应用开发过程中也很容易维护。

您可以在Stanford Course Lecture 14 代码示例中找到更多信息。此外,还可以在斯坦福观看 iTunes 上的免费视频(如果您有 Apple ID)。

希望对您有所帮助。

附:为了简单起见,我假设nameNSStringvolumeNSNumber。对于volume,最好使用NSDecimalNumber 类型。

【讨论】:

非常感谢 Flex_Addicted!但是,有一个问题:为什么我们要在一个类别而不是NSManagedObject 子类中创建这些方法?我有几个课程,我至少需要 7 个类别。 您可以在***.com/questions/9297101/… 和blog.chrismiles.info/2011/06/organising-core-data-for-ios.html 找到信息(我非常喜欢后者的提示)。如果您使用 Xcode 为托管对象生成自定义类的简单解释:如果您修改实体中的某些内容,然后生成类以适应这些更改,Xcode 将覆盖您在原始子类中编写的代码。

以上是关于NSManagedObject 子类的自定义初始化的主要内容,如果未能解决你的问题,请参考以下文章

需要继承 NSManagedObject 的自定义类的子类

如何为子类 NSManagedObject 正确实现自定义初始化程序

NSManagedObject 验证和子类

带有循环的 NSManagedObject 子类的深拷贝

NSManagedObject 子类在 swift 中初始化失败

子类 NSManagedObject 以轻松初始化