Swift 3 核心数据 - Entity(context:) vs Entity(entity: Location.entity(), insertInto: context)

lif*_*ott 3 entity core-data nsmanagedobject ios swift

我看过 2016 年关于 Core Data 的 WWDC 视频并查看了各种教程。我已经看到了使用 Core Data Framework 创建对象以持久化到 managedObjectContext 的各种方法。

在示例中,我将其Day作为一个实体。我想Day为用户使用该应用程序的每一天创建一个新对象。

我遇到过:

第一个选项

let entity = NSEntityDescription.insertNewObject(forEntityName: "Day", into: CoreDataHelper.context)
let object = NSManagedObject(entity: entity, insertInto: CoreDataHelper.context)
Run Code Online (Sandbox Code Playgroud)

第二个选项

let object = Day(entity: Day.entity(), insertInto: CoreDataHelper.context)
Run Code Online (Sandbox Code Playgroud)

第三个选项

let object = Day(context: CoreDataHelper.context)
Run Code Online (Sandbox Code Playgroud)

并且知道人们还提出了其他可能性。

最下面的两个选项有什么区别,因为我在 WWDC 视频中没有看到第二个选项的演示。第三个选项是自动插入到 managedObjectContext 中还是应该采取某种方法将对象插入上下文中,然后使用 NSFetchedResultsController 检索所有对象。

Dav*_*ton 5

第二个选项是在 上的指定初始化器NSManagedObject,它是Day子类。

第三个选项是在Day调用选项 2上定义的便利初始化程序。

第一个选项是废话。第一行创建了一个Day插入上下文的实例,就像选项 2 和 3 一样。第二行尝试Day通过将的实例Day传递 给一个需要 的参数来创建一个实例NSEntityDescription。我怀疑选项 1 应该是这样的:

let entity = NSEntityDescription.entity(forEntityName: "Day", in: CoreDataHelper.context)
let object = NSManagedObject(entity: entity, insertInto: CoreDataHelper.context)
Run Code Online (Sandbox Code Playgroud)

所有选项都有相同的结果。我不确定为什么会有这么多变化。这将是一个只有苹果才能回答的问题。希望这是有帮助的!