【发布时间】:2017-02-06 09:25:13
【问题描述】:
我在使用 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 中的重复对象真的很奇怪。
你能告诉我我应该如何调试它吗?
【问题讨论】:
-
我怀疑您的 FRC didChange 委托函数中有问题,因为重复项显示 1) 仅在更改某些对象后出现在视图中,并且 2) 更改未反映在数据库。我将专注于将 .insert 和 .move 案例与 Apple 建议的代码进行比较,但如果它们没问题,请检查其他案例。自从我去 Xcode 测试版以来已经有一段时间了,但我不记得这里有任何变化,除了一些参数从 AnyObject 切换到 Any 之外,但它们可能对版本 7 不关心的东西很敏感。
标签: ios core-data nsfetchedresultscontroller ios10