为核心数据实体添加便利初始化程序
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)
appDelegate
是 AppDelegate
实例,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
【讨论】:
以上是关于为核心数据实体添加便利初始化程序的主要内容,如果未能解决你的问题,请参考以下文章