我在使用NSFetchedResultsController时遇到了奇怪的行为。它是iOS 10中的新功能。直截了当:fetchedObjects
包含重复的对象。
这不是任何意思,重复"按照我自己的标准。它们实际上具有相同的objectID和相同的引用。
我的应用程序如何发生:
FRC已设置并执行提取
提取了2个对象(在本例中)
我的同步图层中发生了一些事情,另一个对象(提取项目与之关系)已更新
FRC呼叫委托内容确实发生了变化。 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
另一个注意事项:当我重新创建FRC并再次获取对象时,没有重复项。
我根本不知道是什么导致了这个问题。我可能在我的应用程序中做错了导致该错误。无论如何,FRC允许在fetchedObjects
中复制对象,这真的很奇怪。
你能告诉我如何调试它吗?
答案 0 :(得分:1)
我今天也遇到过类似的问题。我注意到在我的情况下,FRC上的获取对象都有临时ID。这些可以这样验证:
fetchedResultsController.fetchedObjects[0].objectID.isTemporary
要在我的应用程序中解决此问题,我在保存导入/更新/同步的新数据的上下文之前为所有插入的对象显式请求永久对象ID:
NSError *error;
[bgContext obtainPermanentIDsForObjects:bgContext.insertedObjects.allObjects error:&error];