【问题标题】:NSFetchedResultsController predicate to eliminate duplicates of several propertiesNSFetchedResultsController 谓词消除多个属性的重复
【发布时间】:2019-01-19 03:12:01
【问题描述】:
我在 UITableViewController 中使用 NSFetchedResultsController。
是否可以指定一个谓词,该谓词不会检索在我指定的 x 个字段中具有重复字段的项目。
例如,我想搜索项目的所有结果,但如果 itemName AND itemDescription AND itemQuantity 相同,我只需要其中一项。
【问题讨论】:
标签:
swift
xcode
core-data
nspredicate
nsfetchedresultscontroller
【解决方案1】:
选项 1
当页面加载时,对数据进行一次运行并保留重复的 objectID 列表。对于重复对象,将单元格的行高设置为 0。所以它们在技术上仍然存在,但你看不到它。这使得处理 NSFetchedResultsControllerDelegate 调用变得容易,因为 indexPaths 没有改变
选项 2
如果始终以相同的方式选择数据集并且重复的对象始终是重复的,则可以在对象中设置“isDuplicate”并在谓词中将其过滤掉。或者您根本无法存储。如果对象以不同的集合和不同的方式显示,有时应该显示有时不显示,这不是一个好的解决方案
选项 3
如果您按照使对象重复的相同标准进行排序(即重复项总是出现在非重复项旁边)并且您不使用部分,那么您可以使用 sectionKeyPath。 SectionKeyPath 将项目组合成部分。将重复项和非重复项分组在一起,然后将每个部分显示为一行(使用每个部分中的第一项)。 fetchedResultsController 的 indexPaths 将与 tableview 的 indexPaths 不匹配,因此您必须小心转换它们。
选项 4
不要从 fetchedResultsController 访问对象,而是执行 fetch 并过滤数组。然后使用数组来显示对象。缺点是当对象更改时您不会获得更新。如果对象被删除,这尤其成问题,因为访问被删除实体的 managedObject 可能会导致崩溃。
我推荐选项 1