在NSManagedObject类中初始化@NSManaged变量?

时间:2015-10-25 17:48:08

标签: ios swift core-data initialization nsmanagedobject

我正在将使用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,那么它似乎会变得非常混乱。

2 个答案:

答案 0 :(得分:1)

如果您从Objective-C移植应用程序,那么为什么不只是执行您的ObjC代码所做的事情(显然,它没有实现-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];
}

答案 1 :(得分:0)

您可以覆盖NSManagedObject的awakeFromInsert方法以填充默认值。请参阅Apple文档here