NSFetchedResultsController 返回重复项(相同的 objectID 和引用)

msm*_*lko 8 core-data nsfetchedresultscontroller ios ios10

我在使用 NSFetchedResultsController 时遇到了奇怪的行为。它是 iOS 10 中的新功能。直截了当:fetchedObjects包含重复的对象。

在我自己的标准中,这绝不是“重复”。它们实际上具有相同的 objectID 和相同的引用。

它是如何在我的应用程序中发生的:

  1. FRC 已设置并执行提取

  2. 获取 2 个对象(在本例中)

  3. 我的同步层发生了一些事情,更新了另一个对象(获取项目与之相关)

  4. FRC 调用delegate 表示内容确实发生了变化。fetchedObjects包含 4 个对象(2 个重复)

这是我在controllerDidChangeContent方法中调试的控制台输出。

po frc.fetchedObjects

    - 0 : <ListItem: 0x1700dc3f0> (entity: ListItem; id: 0x1706294a0 <x-coredata://12D0CB00-7BF4-402A-8371-19DD1CFB1537/ListItem/t3384FC2D-3399-41FE-B7DD-C277922F495445> ; data: { ... }

    - 1 : <ListItem: 0x1700dc3f0> (entity: ListItem; id: 0x1706294a0 <x-coredata://12D0CB00-7BF4-402A-8371-19DD1CFB1537/ListItem/t3384FC2D-3399-41FE-B7DD-C277922F495445> ; data: { ... }

    - 2 : <ListItem: 0x1704c49f0> (entity: ListItem; id: 0x170631680 <x-coredata://12D0CB00-7BF4-402A-8371-19DD1CFB1537/ListItem/t3384FC2D-3399-41FE-B7DD-C277922F495446> ; data: { ... }

    - 3 : <ListItem: 0x1704c49f0> (entity: ListItem; id: 0x170631680 <x-coredata://12D0CB00-7BF4-402A-8371-19DD1CFB1537/ListItem/t3384FC2D-3399-41FE-B7DD-C277922F495446> ; data: { ... }


(lldb) po frc.fetchedObjects![0].objectID.isEqual(frc.fetchedObjects![1].objectID)
true
Run Code Online (Sandbox Code Playgroud)

另一个注意事项:当我重新创建 FRC 并再次获取对象时,没有重复项。

我只是不知道是什么导致了这个问题。我可能在我的应用程序中做错了什么导致该错误。无论如何,FRC 允许在fetchedObjects. 你能给我任何关于我应该如何调试它的线索吗?

Ale*_*exR 7

我今天也遇到了类似的问题。我注意到在我的情况下,FRC 上获取的对象都有临时 ID。这些可以像这样验证:

fetchedResultsController.fetchedObjects[0].objectID.isTemporary
Run Code Online (Sandbox Code Playgroud)

为了在我的应用程序中解决这个问题,在保存导入/更新/同步新数据的上下文之前,我明确请求所有插入对象的永久对象 ID :

NSError *error;
[bgContext obtainPermanentIDsForObjects:bgContext.insertedObjects.allObjects error:&error];
Run Code Online (Sandbox Code Playgroud)