Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么NSManagedObjectID会发生变化?_Ios_Core Data - Fatal编程技术网

Ios 为什么NSManagedObjectID会发生变化?

Ios 为什么NSManagedObjectID会发生变化?,ios,core-data,Ios,Core Data,我不确定这个问题的格式是否适合这个网站 基本上,有人知道是什么说服了苹果做出这样的设计决定,即每当您将数据保存到持久存储时,NSManagedObjectID都会发生变化 我可能错了,但这个决定听起来很可疑。 没有明显的优势(它是一个UUID!它是唯一的!),但它会使通过objectID的对象在保存对象时随时发生变化 这对我来说是一个大问题,因为我使用三个MOC系统(后台MOC->UI MOC->Persistent MOC),对象被插入后台MOC,并通过保存向上传播。保存是异步的,因为它必须在

我不确定这个问题的格式是否适合这个网站

基本上,有人知道是什么说服了苹果做出这样的设计决定,即每当您将数据保存到持久存储时,NSManagedObjectID都会发生变化

我可能错了,但这个决定听起来很可疑。 没有明显的优势(它是一个UUID!它是唯一的!),但它会使通过objectID的对象在保存对象时随时发生变化

这对我来说是一个大问题,因为我使用三个MOC系统(后台MOC->UI MOC->Persistent MOC),对象被插入后台MOC,并通过保存向上传播。保存是异步的,因为它必须在三个不同的MOC上传播,并且在创建对象之后返回对象,但是在将它们保存到持久存储之前是非常痛苦的,因为我不能依赖于传递objectID

我是不是做错了什么?有人知道UUID在没有通知的情况下随时可变有什么好处吗


我最大的问题是为什么要提供临时managedObjectID。这有什么意义吗?这只是为了迷惑人们去尝试使用它吗?

我绝对不是核心数据方面的专家,但我的理解是,
NSManagedObjectID
在大多数情况下都是唯一的。例外情况如下:

  • 当您创建一个新对象,但它尚未提交时,它的id将是临时的。您可以使用
    isTemporaryId
    检查此情况
  • 当备份存储发生变化时,即如果您正在使用iCloud并迁移到数据库的新版本
既然您谈论的是单个生命周期,我想我们正在考虑第一个选项。如果是这种情况,您应该等到更改传播到持久性存储之后再获取id。我认为您可以从同一个对象获取id,即创建该对象,保留指向该对象的指针,保存上下文,然后从保留的指针获取该对象的id。警告:我从来没有真正这样做过,这只是我根据对文档的阅读得出的结论

此外,临时id应该一直存在,直到您保存上下文为止,因此您只需要担心一次——在第一次保存新对象的上下文之后


顺便说一句,在我看来,CoreData必须以这种方式实现。如果他们在实际将id插入持久性存储之前试图保证id是唯一的,那么在提交之前,如果两个不同的上下文抓住了相同的id,会发生什么情况?保证id的唯一性/防止某种竞争条件的唯一方法是在将记录插入数据库时找到唯一的id。。。否则,CoreData将不得不以某种方式为子上下文插入的每个记录插入一个伪值…

我有点困惑为什么您一直说NSManagedObjectID是一个UUID。URI表示可能与UUID格式有类似的外观,但我在文档中没有看到任何地方说“a
NSManagedObjectID
是UUID”(我将在下面讨论,它不仅仅是这样)。苹果为什么要这样设计它超出了StackOverflow的范围,所以希望你的问题是“核心数据的设计是什么,我如何使用它?”

文档中的说明是,如果要进行此类对象跟踪,应将自己的UUID添加为属性:

您有时可以从创建自己的唯一ID(UUID)属性中获益,该属性可以为新插入的对象定义和设置。这允许您使用谓词高效地定位特定对象(尽管在执行保存操作之前,只能在原始上下文中找到新对象)

NSManagedObjectID
更改的原因可以从不变的数据结构中看出。它包括一个
persistentStore
属性。在实际保存对象之前无法确定这一点(例如,您可以调用
assignObject:toPersistentStore:
)。再次强调,不要从URI表示的角度来考虑NSManagedObjectID;这只是一种序列化格式。真实ID包括持久存储,如文档中所示:

与数据库中的主键一样,标识符包含准确描述持久存储中对象所需的信息,尽管详细信息不会公开


在插入对象之前,该标识符无法最终确定。

@samson我在谷歌搜索解决方案时看到了这个问题。我不确定它和我的有什么共同之处--请你详细说明一下好吗?在这个问题中,brianpartridge问他为什么不能将
NSManagedObjectID
存储在一个单独的持久存储中,而我的问题是为什么它会在application@che我要说的是不要重复-这与潜在的重复没有太多共同之处。@Undo:谢谢你的语法修复。@DanShelly,我可以,但是我觉得这个方法很混乱。如果有层次结构的MOCS,考虑每一个都运行在自己的队列上,从最低的调用“<代码>获取永久性< /代码>”。会发生什么?它如何在您的层次结构中传播?哪些主运行中心被阻止,哪些不被阻止?它如何在没有实际写入的情况下保留空间?只有苹果知道。谢谢你的回答,但它有两个问题:保证唯一性的唯一方法是在将记录插入数据库时找到唯一的id。No!这是一个好主意。他们不需要“抓住”它。它与数据库中的主键无关。你应该等到得到你的ID,直到你的变化传播了。不考虑MOC在后台线程,其父母是UI MOC。后台保存线程不能等待UI