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

时间:2016-09-28 11:58:21

标签: ios core-data nsfetchedresultscontroller ios10

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

这不是任何意思,重复"按照我自己的标准。它们实际上具有相同的objectID和相同的引用。

我的应用程序如何发生:

  1. FRC已设置并执行提取

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

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

  4. FRC呼叫委托内容确实发生了变化。 fetchedObjects包含4个对象(2个重复)

  5. 这是我在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
    

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

    我根本不知道是什么导致了这个问题。我可能在我的应用程序中做错了导致该错误。无论如何,FRC允许在fetchedObjects中复制对象,这真的很奇怪。 你能告诉我如何调试它吗?

1 个答案:

答案 0 :(得分:1)

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

fetchedResultsController.fetchedObjects[0].objectID.isTemporary

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

NSError *error;
[bgContext obtainPermanentIDsForObjects:bgContext.insertedObjects.allObjects error:&error];