【问题标题】:NSFetchedResultsController returns duplicates (the same objectID and reference)NSFetchedResultsController 返回重复项(相同的 objectID 和引用)
【发布时间】:2017-02-06 09:25:13
【问题描述】:

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

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

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

  1. FRC 已设置并执行提取

  2. 获取了 2 个对象(在此示例中)

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

  4. 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 中的重复对象真的很奇怪。 你能告诉我我应该如何调试它吗?

【问题讨论】:

  • 我怀疑您的 FRC didChange 委托函数中有问题,因为重复项显示 1) 仅在更改某些对象后出现在视图中,并且 2) 更改未反映在数据库。我将专注于将 .insert 和 .move 案例与 Apple 建议的代码进行比较,但如果它们没问题,请检查其他案例。自从我去 Xcode 测试版以来已经有一段时间了,但我不记得这里有任何变化,除了一些参数从 AnyObject 切换到 Any 之外,但它们可能对版本 7 不关心的东西很敏感。

标签: ios core-data nsfetchedresultscontroller ios10


【解决方案1】:

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

fetchedResultsController.fetchedObjects[0].objectID.isTemporary

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

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

【讨论】:

  • 这太棒了。谢谢。
  • 在 ios 14 更新之前,我从未遇到过 FRC 重复问题。
  • @berec 您是否对其进行了修复,例如self.persistentContainer.viewContext.obtainPermanentIDs() 函数?我尝试了这个,但有时仍然会看到重复项,例如在第一次启动应用时与互联网断开连接。
  • @professormeowingtons 获得永久 ID 对我有用。如果您在第一次启动时有重复,那么看起来您处理的是持久存储中的实际重复。
  • AlexYu 你救了我。我在 iOS 14 上遇到了这个问题,我不敢相信这个问题仍然存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 2022-12-03
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 2010-12-11
相关资源
最近更新 更多