【问题标题】: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 定义的实体中?

【问题讨论】:

    标签: ios core-data swift3


    【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-18
      • 2011-12-18
      相关资源
      最近更新 更多