我目前遇到一个问题,即在后台子线程(其父级是主 UI 线程上下文)上创建新对象并保存会导致我的NSFetchedResultsController
显示两个新对象:一个带有临时对象objectID
,以及一个具有永久objectID
。这似乎是某种错误,除非我遗漏了一些东西。
所以我想我应该为我创建的任何新对象手动获取永久 ID。这修复了重复行问题,但引入了新的随机错误(例如“无法满足对象的错误”,指的是我创建的新对象)。如果有人对为什么发生上述情况有任何想法,请分享。
我正在猜测obtainPermanentIDs
是朝着正确方向迈出的一步。但是我什么时候调用这个方法呢?在保存到子上下文之前?在拯救孩子之后和在父母之前?在父母之后?
目前我的设置是这样的:
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: ),我应该在哪里调用obtainPermanentIDs
?
(或者除了调用获取永久ID之外,是否有人有不同的解决方案?引入此方法是为了解决什么问题?为什么我要调用此方法?)
Update:我想我知道发生了什么(虽然这只是一个理论),但不知道如何解决它。当对象物理保存到磁盘时,Core Data 显然会生成对象的永久 ID。所以就我而言,直到我在 masterMOC 上调用 save 之前,这种情况不会发生。目前我在backgroundMOC上创建新对象时所做的是:
- 保存在backgroundMOC上(以便更改被上推一级到mainMOC,并且我的表视图可以插入新行)
- 保存在 mainMOC 上(以便我可以准备保存到磁盘)
- 保存在masterMOC上(最终保存到磁盘)
这里发生的情况是,在backgroundMOC上调用save会触发UI更新,并导致获取的结果控制器插入一个仍然只有临时ID的新对象。但随后在 masterMOC 上调用 save 会导致所有对象获得分配的永久 ID,这会导致另一个 UI 更新,为这个“新”对象插入另一行!通过注释掉最后一个 masterMOC 保存,我不再看到重复的条目。我在这里做错了什么,还是这是某种错误?
另一个更新:我想我已经基本确认了这个错误。我在backgroundMOC上调用save,然后设置一个计时器,5秒后在mainMOC和masterMOC上调用save。保存到后台MOC后,新行会立即插入到我的表中。 5 秒后(保存 main 和 master 后),插入另一个新行。 (首先插入的行有一个临时 ID,最新插入的行有永久 ID)。