如何在iOS 9.0 Beta中实现新的Core Data模型构build器的“独特”属性

在WWDC15video会议“核心数据的新特性”中,苹果工程师在10:45分钟(介绍中)描述了模型生成器的一个新function,允许您指定独特的属性。 一旦你设置了这些独特的属性,核心数据将不会使用该属性创build一个重复的对象。 这是假设消除需要检查之前,如果一个相同的对象创build一个新的对象。

我一直在尝试这个,但没有运气阻止具有相同的“唯一”属性(重复对象)的新对象的创build。 除了5分钟的video解释,我还没有find任何其他信息来描述如何使用这个function。

在这里输入图像说明

有没有人有任何经验在核心数据模型中实现“唯一”属性属性?

简短的回答:您需要将此行添加到您的核心数据堆栈设置代码:

managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy 

很长的回答:我已经有一段时间了,但我想我现在已经明白了:

唯一约束(UC)不会阻止在上下文中创build重复项。 只有当您尝试保存上下文时,Core Data才会检查UCs的唯一性。

如果find多个具有相同UC值的对象,则默认行为是抛出错误,因为冲突的默认合并策略是NSErrorMergePolicyType 。 该错误包含userInfo.conflictList中的冲突对象,因此您可以手动解决冲突。

但大多数情况下,您可能想要使用其他合并策略之一,并让Core Data自动合并冲突。 这些合并策略之前确实存在,它们用于不同上下文中的对象之间的冲突。 也许这就是为什么他们没有在WWDC会话220的UCfunction的上下文中提到。通常正确的select是NSMergeByPropertyObjectTrumpMergePolicy 。 它基本上是说“新数据胜过旧数据”,当您从外部来源导入新数据时,这是您在常见情况下想要的。

(提示:首先我有问题来validation这种行为,因为重复的对象似乎留在上下文中,直到保存操作完成 – 在我的情况下,在后台队列中asynchronous发生。所以如果你击中后立即获取/计数你的对象保存button,你可能仍然看到重复。)

我不知道正确的答案,因为这是一个testing版本,但玩了一分钟后,我find了一个方法使其工作:

  1. 告诉模型哪些属性形成了唯一约束,完全如您在问题中所显示的图片所示。

  2. 添加新logging:

 let newTag = NSEntityDescription.insertNewObjectForEntityForName("Tag", inManagedObjectContext: context) as! Tag 
  1. 将值分配给参数。

  2. 保存您的更改:

 do { try context.save() } catch let error as NSError { print("Error: \(error.localizedDescription)") context.reset() } 

关键是在catch块。 如果发生错误,请将上下文重置为以前的状态。 由于保存操作失败,重复logging将不存在。

请注意,您应该检查错误,看看是否是由重复logging引起的。

我希望这有帮助。