NSFetchedResultsController 谓词消除多个属性的重复项

NSFetchedResultsController predicate to eliminate duplicates of several properties

我在我的 UITableViewController 中使用 NSFetchedResultsController。

是否可以指定一个谓词,它不会检索在我指定的 x 个字段中具有重复字段的项目。

例如,我想搜索项目的所有结果,但如果 itemName AND itemDescription 和 itemQuantity 相同,我只想要这些项目中的一个。

选项 1

当页面加载时,通过数据执行单个 运行 并保留重复的 objectID 列表。对于重复对象,将单元格的行高设置为 0。因此它们在技术上仍然存在,但您看不到。这使得处理 NSFetchedResultsControllerDelegate 调用变得容易,因为 indexPaths 没有改变

选项 2

如果始终以相同方式选择数据集并且重复的对象始终是重复的,您可以在对象中设置 'isDuplicate' 并在谓词中将其过滤掉。或者您根本无法存储。如果对象在不同的​​集合中以不同的方式显示,有时应该显示,有时不显示,这不是一个好的解决方案

选项 3

如果您按照使对象重复的相同标准进行排序(即重复项总是出现在非重复项的旁边)并且您没有使用部分,那么您可以使用 sectionKeyPath。 SectionKeyPath 将项目组合成多个部分。将重复项和非重复项分组在一起,然后将每个部分显示为一行(使用每个部分中的第一项)。 fetchedResultsController 的 indexPaths 将与 tableview 的 indexPaths 不匹配,因此您必须小心转换它们。

选项 4

不是从 fetchedResultsController 访问对象,而是执行获取和过滤数组。然后使用数组来显示对象。缺点是您无法获得对象更改时的更新。如果对象被删除,这可能尤其成问题,因为访问实体被删除的托管对象可能会导致崩溃。

我推荐选项 1