iphone – 什么时候调用getsPermanentIDsForObjects?

我正在遇到一个问题,即在后台子线程(其父级是主UI线程上下文)上创建一个新对象,并且保存会导致NSFetchedResultsController显示两个新对象:一个具有临时objectID,一个具有永久objectID 。这似乎是某种错误,除非我错过了一些东西。

所以我以为我会手动获取任何我创建的新对象的永久ID。这会修复重复的行问题,但会引入新的随机错误(例如“无法实现对象的故障”,请参阅我创建的新对象)。如果任何人有任何想法,为什么之前提到的任何事情发生,请分享。

我猜想获得PermanentID是朝着正确方向迈出的一步。但是我什么时候打这个方法?在保存到子上下文之前?保存孩子和父母之前?父母后?
目前我的设置是这样的:

masterMOC - private queue tied to the persistent store, so physical saves happen here
----mainMOC - main queue tied to the UI, child of masterMOC
-------backgroundMOC - private queue, child of mainMOC

所以如果我在backgroundMOC上创建一个新对象,并且我打算立即保存到磁盘(这意味着我必须调用save:在所有三个上下文中),我应该在哪里调用getsPermanentID?

(或者如果有人有一个不同的解决方案,而不是调用获取永久ids?这个方法引入什么问题呢?为什么要调用这个方法?)

更新:
我想我发现了什么(这只是一个理论),虽然不是如何解决它。核心数据在物理上保存到磁盘时显然会生成对象的永久ID。所以在我的情况下,这不会发生,直到我在masterMOC上保存。当前在backgroundMOC上创建一个新对象时,我做的是:

>保存在backgroundMOC(以便将更改推送到mainMOC的一个级别,我的表视图可以插入新行)
>保存在mainMOC(以便我可以准备保存到磁盘)
>保存在masterMOC(最终保存到磁盘)

这里发生的情况是,在backgroundMOC上调用save触发UI更新,并导致获取的结果控制器插入仍然只有临时ID的新对象。但是,然后在masterMOC上调用save将导致所有对象被赋予永久ID,这将导致另一个UI更新,为“新”对象插入另一行!通过注释掉最后一个masterMOC保存,我不再看到重复的条目。我在这里做错什么,还是这种bug?

另一个更新:我想我已经确认了这个bug。我打电话保存在backgroundMOC上,然后在mainMOC和masterMOC上设置一个定时器来呼叫保存5秒钟。 Immediatley保存到backgroundMOC后,一个新的行被插入到我的表中。 5秒后(保存主和主),插入另一个新行。 (首先插入一个temp id,最新的insert具有永久id)。

我有完全相同的问题,当然在一个特别困难和沮丧的一天调试一切,以找出问题是临时ID。 🙂

我具有与你完全相同的结构,我也有NSManagedObjectContext的子类来编纂我期望在后台和主要上下文中保存的行为 – 即在后台上下文中保存应该保存主要上下文(并且主要上下文应该同步任何与外部服务更改的对象,这是不相关的,但值得一提的是为什么我有两个子类),并保存在主上下文中应该保存主上下文。

在我的RFSImportContext子类(相当于你的backgroundMOC)中,我实现 – 保存:调用[super save:],然后调用[self.parentContext performBlock:](self.parentContext这里等同于你的mainM)C,其中块调用getsPermanentIDsForObjects:与主上下文的 – updatedObjects和 – insertedObjects数组的内容,然后我保存主上下文。

我不再像临时对象那样泄漏给我的NSFetchedResultsController。一种改进情况的方法是使用RFSMainContext子类(同样等同于您的mainMOC)来实现 – 保存:获取永久对象ID,保存自身,然后保存主上下文。这将编译我们一直希望主要上下文在其被保存时具有对象的永久ID的行为。

翻译自:https://stackoverflow.com/questions/11336120/when-to-call-obtainpermanentidsforobjects

转载注明原文:iphone – 什么时候调用getsPermanentIDsForObjects?