在 NSManagedObject 类中初始化 @NSManaged 变量?
Posted
技术标签:
【中文标题】在 NSManagedObject 类中初始化 @NSManaged 变量?【英文标题】:Initialize @NSManaged variables in an NSManagedObject class? 【发布时间】:2015-10-25 17:48:07 【问题描述】:我正在将使用Swift
编写的项目转换为使用CoreData
。一切正常,除了现在我试图将自定义类转换为NSManagedObject
类以将其属性存储在CoreData
中。它看起来像这样:
import UIKit
import CoreData
class Jar: NSManagedObject
@NSManaged var name: String
@NSManaged var jarDescription: String
@NSManaged var jarType: UIImage
@NSManaged var progress: Int
@NSManaged var jarSize: Int
/*
init()
name = "Some Jar"
jarType = UIImage(named: "EmptyJar3.png")
progress = 0
jarSize = 60
jarDescription = ""
*/
我已经注释掉了init()
,因为根据我的阅读,您不能在NSManagedObject
上使用初始化方法。但是,我在项目中的其他地方有代码实例化Jar
类型的对象,对于没有为此类明确设置的属性,我希望为这些属性设置某种默认初始值。
有没有办法在class Jar: NSManagedObject
中做到这一点?如果我正在编写检查方法以查看是否设置了属性,然后将它们显式保存到CoreData
,这似乎会变得非常混乱,我在任何地方都实例化了一个新的Jar
对象。
【问题讨论】:
【参考方案1】:如果您是从 Objective-C 移植应用程序,那么为什么不做您的 ObjC 代码所做的事情(显然,它没有实现 -init)。
您可以提供您自己的自定义 init 方法,但您必须确保正确调用 initWithEntity:insertIntoManagedObjectContext:
,并且您最好仔细阅读文档。
您可以覆盖 awakeFromInsert
和/或 awakeFromFetch
,但您应该注意这样做涉及的一些特质。
我发现,一般来说,如果您希望进行特殊初始化,那么您最好编写工厂方法。我相信你可以用 swift 中的“类方法”做同样的事情,但是我还没有理由写任何 swift,所以我不知道 swift,所以我将在 ObjC 中给出示例,你可以解释其余的。
例如...
+ (NSString*)entityName
return @"Jar";
+ (instancetype)jarWithName:(NSString*)name
imageName:(NSString*)imageName
size:(NSUInteger)size
inManagedObjectContext:(NSManagedObjectContext*)context
Jar *jar = [NSEntityDescription
insertNewObjectForEntityForName:[self entityName]
inManagedObjectContext:context];
jar.name = name;
jar.jarDescription = @"";
jar.jarType = [UIImage imageNamed:imageName];
jar.progress = 0;
jar.jarSize = size;
return jar;
+ (instancetype)jarInManagedObjectContext:(NSManagedObjectContext*)context
return [self jarWithName:@"Some Jar"
imageName:@"EmptyJar3.png"
size:60
inManagedObjectContext:context];
【讨论】:
【参考方案2】:您可以覆盖 NSManagedObject 的 awakeFromInsert
方法来填充默认值。请参阅 Apple 文档here
【讨论】:
在使用awakeFromInsert
时要非常小心,尤其是在将它们与父/子 MOC 一起使用时,因为它可以为“相同”对象多次调用 - 请注意不是完全相同的对象,因为它在不同的托管对象上下文中,但它是同一个逻辑对象。以上是关于在 NSManagedObject 类中初始化 @NSManaged 变量?的主要内容,如果未能解决你的问题,请参考以下文章
如何将@NSManaged 对象类中的变量初始化为 JSON 值?
如何在单个托管对象上下文中初始化新的 NSManagedObject 并设置与另一个 NSManagedObject 的关系?
NSManagedObject 子类在 swift 中初始化失败
未能在 NSManagedObject 类“ClassName”上调用指定的初始化程序