我总是用这个来创建我的管理对象
convenience init(context moc: NSManagedObjectContext)
。
但是我遇到了这个话题https://forums.developer.apple.com/forums/thread/74186
所以,现在我想知道哪种方法是最正确的。我现在看到至少有 4 种 NSManagedObject 初始化方式(不包括简单的
init()
)。
也许其中一些有性能优势或者其他什么?有人可以一劳永逸地澄清一下吗?
// 1
let managedObject = MyManagedObject(context: context)
// 2
let managedObject = NSManagedObject(
entity: MyManagedObject.entity(),
insertInto: context
) as? MyManagedObject
// 3
let entity = NSEntityDescription.entity(
forEntityName: "MyManagedObject",
in: context
)
let managedObject = NSManagedObject(
entity: entity!,
insertInto: context
) as? MyManagedObject
// 4
let managedObject = NSEntityDescription.insertNewObject(
forEntityName: "MyManagedObject",
into: context
) as? MyManagedObject
首先,链接帖子已有 7 年历史了。 Swift 语言发展得相当快。
第二个接受的答案是错误的。您提到的所有初始化方法基本上都是相同的,它们创建一个实例并将其插入到上下文中。
但是也有差异。唯一的方法 #1 返回实际
NSManagedObject
子类 MyManagedObject
. 的非可选实例
方式 #2–#4 返回一个可选的
NSManagedObject
实例 – 基类 – 必须将其转换为所需的类型。
据我所知,#1 的语法是在发布该主题时刚刚引入的。如今
init(context:)
是强烈推荐的 API,因为它是最安全的 API(不涉及文字字符串,也不涉及类型转换)并且它返回正确的类型,感谢您使许多核心数据类型变得通用。
就性能而言,两者之间没有任何优势。