基本上,有没有人知道什么使得Apple确保在每次将数据保存到持久存储时NSManagedObjectID发生变化的设计决策?
我可能错了,但这个决定对我来说听起来很可疑.
没有明显的优势(它是一个UUID!它是唯一的!),但是它传递了objectID – 它可以在保存对象的任何时候在你的脚下改变.
这对我来说是一个大问题,因为我使用三个MOC系统(背景MOC – > UI MOC – >持久性MOC),将对象插入到背景MOC中并通过保存向上传播.保存是异步的,因为它必须在三个不同的MOC上传播并在创建它们之后返回它们,但在它们被保存到持久存储之前是非常痛苦的,因为我不能依赖于传递objectID.
我做的事特别错吗?有没有人知道UUID在没有通知的情况下随时可变的优势是什么?
我最大的问题是为什么提供临时的managedObjectID.它有什么意义吗?只是让人们混淆试图使用它吗?
解决方法
文档说的内容(在Managed Object IDs and URIs中)是,如果要进行此类对象跟踪,则应将自己的UUID添加为属性:
You can sometimes benefit from creating your own unique ID (UUID) property which can be defined and set for newly inserted objects. This allows you to efficiently locate specific objects using predicates (though before a save operation new objects can be found only in their original context).
可以从不可变数据结构中看到NSManagedObjectID更改的原因.它包含persistentStore属性.在您实际保存对象之前,您无法确定这一点(例如,您可以调用assignObject:toPersistentStore:).同样,不要考虑NSManagedObjectID的URI表示;这只是一种序列化格式.真实ID包括持久性存储,如文档中所示:
Like the primary key in the database,an identifier contains the information needed to exactly describe an object in a persistent store,although the detailed information is not exposed.
在插入对象之前,无法最终确定该标识符.