ios - 如何创建谓词来获取同一属性的所有不重复结果的实体?

标签 ios swift core-data nspredicate

我需要实现多种语言的常见问题解答。因此,我创建了具有以下属性的实体 Question:

  • 语言
  • 集合 - 用不同语言标记同一问题

存储

所有这些都保存在 iCloud 的公共(public)数据库中。

获取

在应用程序中,我获取有关 en 语言和应用程序上安装的当前语言的所有问题。全部保存在核心数据中。

显示

我需要显示(使用 FRC)当前语言的所有问题和英语的所有问题(如果没有为当前语言创建具有相同集合的问题)。

示例(问题、语言、集合):

Q1, pl, 1
Q2, pl, 3
Q3, en, 1
Q4, de, 1
Q5, es, 2
Q6, en, 2

如果我当前的语言是pl,那么我想获取以下问题:

Q1, pl, 1
Q2, pl, 3
Q6, en, 2

我怎样才能实现这一目标?我需要创建 NSPredicate 来简单地排除那些预计不会获取它们的问题。

最佳答案

解决方案1

这个问题你想太多了。如果您处理的实体少于 500 个(我假设您是这样),那么通过查询进行过滤或在获取后执行内存过滤之间的性能差异非常小。而且,您似乎不必处理获取后对象的更改 - 因此使用 fecthedResultsController 并没有太大的好处。只需获取它们全部,然后像处理任何数组一样对它们进行过滤和排序。

如果您不排序和显示用户数据,而只是从服务器下载静态数据,那么可能值得考虑根本不使用核心数据 - 但我相信您已经研究过这些替代方案。

解决方案2

您可以使用sectionKeyPath通过fecthedResultsController解决这个问题。按集合对请求进行排序,然后按集合对请求进行分组。现在每个部分代表一个集合。使collectionView中的行数等于FRC的节数。对于每一行,查看该部分并选择最喜欢的语言的问题。仅当您按“集合”键排序时,这才有效。如果您想以不同的方式对它们进行排序,您可以更改“集合”值,而不仅仅是随机 int 或 uuid,而是以您想要的方式排序。

关于ios - 如何创建谓词来获取同一属性的所有不重复结果的实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51961475/

相关文章:

ios - 使用 Xcode 6.0-beta 添加手机间隙平台时出错

ios - show segue 后我的 viewcontroller 没有被取消初始化

ios - 删除字符串中的最后两个字符

swift - 可用打印机及其 URL 的日志列表

iphone - 具有空部分的 nsfetchedresultscontroller

ios - NSArray 到 NSData 编码格式化

ios - NSDateFormatter 的自定义月份和星期几名称

ios - Swift 中的prepareForSegue 错误

core-data - 在 iOS 中使用 NSPersistentCloudKitContainer 时获取错误堆栈跟踪

ios - 表达式类型 bool 在没有更多上下文的情况下不明确