在 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”上调用指定的初始化程序

CoreData:错误:无法在 NSManagedObject 类上调用指定的初始化程序

调用 NSManagedObject 类上的指定初始化程序失败 - CoreData