为核心数据实体添加便利初始化程序

Posted

技术标签:

【中文标题】为核心数据实体添加便利初始化程序【英文标题】:Adding a convenience initializer for a core data Entity 【发布时间】:2017-04-10 20:56:48 【问题描述】:

在 Swift 3/Xcode 8 中,如何为 Core Data 实体创建便捷初始化器?现在我有一个普通的类,并使用一个方便的初始化程序来保存来自 JSON 的数据,如下所示:

convenience init?(json: [String: Any]) 
    let id = json["id"] as! Int
    let title = json["title"] as! String
    let subtitle = json["subtitle"] as? String

    self.init(
        anId: id,
        aTitle: title,
        aSubtitle: subtitle,
    )

有没有一种简单的方法可以将这样的内容添加到 Core Data 定义的实体中?

【问题讨论】:

【参考方案1】:

是的,无论如何你必须调用NSManagedObject / NSEntityDescription的指定初始化器。

类似这样的:

class Foo: NSManagedObject 

    @NSManaged var title: String
    @NSManaged var subtitle: String?
    @NSManaged var id: Int32

    class func create(in context: NSManagedObjectContext, from json: [String: Any]) -> Foo 
        let foo = NSEntityDescription.insertNewObject(forEntityName: "Foo", into: context) as! Foo
        foo.title = json["title"] as! String
        foo.subtitle = json["subtitle"] as? String
        foo.id = json["id"] as! Int32
        return foo
    

create(in是类方法,可以调用

let context = appDelegate.managedObjectContext
let newItem = Foo.create(in: context, from: jsonDictionary)

appDelegateAppDelegate 实例,jsonDictionary[String:Any] 字典。

【讨论】:

我必须做一些其他的事情。在 xcdatamodel 的 DataModel 检查器中,我必须将 codegen 设置为 Category/Extension,并且必须在类定义上方添加 @objc(Foo)。并且显然还导入了 CoreData。【参考方案2】:

只需使用方便的初始化器扩展您的类:

convenience init(
  context moc: NSManagedObjectContext, 
  json: [String: Any]
) 
    self.init(context: moc)

    id = json["id"] as? Int
    title = json["title"] as? String
    subtitle = json["subtitle"] as? String

【讨论】:

以上是关于为核心数据实体添加便利初始化程序的主要内容,如果未能解决你的问题,请参考以下文章

多线程核心数据:“主”上下文线程

核心数据:无法将持久存储添加到协调器

在初始加载时快速重置核心数据属性标志?

核心数据多实体

iOS使用UIManagedDocument添加初始核心数据文件,而不是appdelegate

向核心数据添加新实体并填充一些值