我不确定这个问题的格式对这个网站是否有用.
基本上,有没有人知道什么使得Apple确保在每次将数据保存到持久存储时NSManagedObjectID发生变化的设计决策?
我可能错了,但这个决定对我来说听起来很可疑.没有明显的优势(它是一个UUID!它是唯一的!),但是它传递了objectID - 它可以在保存对象的任何时候在你的脚下改变.
这对我来说是个大问题,因为我使用了三个MOC系统(后台MOC - > UI MOC - >持久性MOC),对象被插入到后台MOC中并通过保存向上传播.保存是异步的,因为它必须在三个不同的MOC上传播并在创建它们之后返回它们,但在它们被保存到持久存储之前是非常痛苦的,因为我不能依赖于传递objectID.
我做的事特别错吗?有没有人知道UUID在没有通知的情况下随时可变的优势是什么?
我最大的问题是为什么提供临时的managedObjectID.它有什么意义吗?只是让人们混淆试图使用它吗?
Rob*_*ier 10
我有点困惑为什么你一直说这NSManagedObjectID是特别是UUID.URI表示可能具有与UUID格式类似的外观,但我没有在文档中看到它表示"a NSManagedObjectID是UUID"(正如我将在下面讨论的,它不仅仅是这个).为什么Apple以这种方式设计它超出了StackOverflow的范围,所以希望你的问题真的是"什么是Core Data的设计,我该如何使用它?"
文档所说的(在托管对象ID和URI中)是,如果要进行此类对象跟踪,则应将自己的UUID添加为属性:
您有时可以从创建自己的唯一ID(UUID)属性中受益,该属性可以为新插入的对象定义和设置.这允许您使用谓词有效地定位特定对象(但在保存操作之前,只能在其原始上下文中找到新对象).
NSManagedObjectID可以从不可变数据结构中看到更改的原因.它包括一个persistentStore属性.在您实际保存对象之前无法确定这一点(您可能会调用assignObject:toPersistentStore:该实例).同样,不要考虑NSManagedObjectID它的URI表示; 这只是一种序列化格式.真实ID包括持久性存储,如文档中所示:
与数据库中的主键一样,标识符包含准确描述持久存储中的对象所需的信息,但不公开详细信息.
在插入对象之前,无法最终确定该标识符.
我绝不是核心数据专家,但我的理解是,NSManagedObjectID在大多数情况下保证是独一无二的.例外情况是:
isTemporaryId.既然你在谈论一个生命周期,我想我们正在考虑第一个选择.如果是这样的话,你应该等待的将ID,直到之后更改已传播到持久性存储.我认为你可以从同一个对象获取id,即创建对象,保留指向它的指针,保存上下文,然后从保留的指针中获取该对象的id.警告:我从来没有真正做到这一点,这只是基于我阅读文档的结论.
此外,临时ID应该保留,直到您保存上下文,因此您应该只需要担心这一次 - 在第一次保存新对象的上下文之后.
顺便说一句,在我看来,CoreData 必须以这种方式实现.如果他们在实际将id插入持久存储之前试图保证id是唯一的,那么如果两个不同的上下文在提交之前获取相同的id会发生什么?保证唯一性/防止id的竞争条件的唯一方法是在将记录插入数据库时找到唯一的id ...否则,CoreData必须以某种方式为子上下文插入的每个记录插入一个虚拟值. ..
| 归档时间: |
|
| 查看次数: |
3914 次 |
| 最近记录: |