【问题标题】:How to use predicate on object's array of objects values in iOS如何在iOS中对对象的对象值数组使用谓词
【发布时间】:2016-02-03 10:00:00
【问题描述】:

我有一个 Exit 对象。 每个 Exit 都有一个 Category 对象数组。

对象看起来像这样:

类别:(id,名称)

退出:(id,name,number,...,NSArray(Categories),...)

我想使用 NSPredicate 过滤掉它们在 Category 数组中的 Category name 的退出,但我不确定如何准确地写下来。 例如,如果我想按出口名称过滤出口,我会这样做

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.exitName = %@", name];
NSArray *results = [exits filteredArrayUsingPredicate:predicate];

但我不确定如何进入类别数组并按类别名称搜索。

有什么建议吗?

【问题讨论】:

  • 试试这个,NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF.categories.name CONTAINS[c] %@", name];
  • categories 是一个 NSArray,没有 name 属性。

标签: ios objective-c arrays nspredicate


【解决方案1】:

试试这个

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF.exitName.category_name CONTAINS[c] %@", name];
NSArray *results = [exits filteredArrayUsingPredicate:predicate];

【讨论】:

  • SELF 是出口,category_name 不是出口名称的属性。
  • 在谓词格式中,SELF可以看作是Exit的一个实例。 Exit 没有属性 exitName,属性是名称。此名称属性没有属性 category_name。这个谓词不起作用。
【解决方案2】:

试试这个谓词

NSPredicate *matchingCategory = [NSPredicate predicateWithFormat:@"SUBQUERY(categories, $c, name CONTAINS[cd] %@).@count > 0", categoryName];

说明

SUBQUERY() 函数创建一个与给定子谓词匹配的对象数组。在这种情况下,该子谓词是name CONTAINS[cd] %@。它的工作方式是遍历集合(第一个参数),分配名称$c(第二个参数)来引用每个元素,然后测试子谓词是否与该元素匹配。如果匹配,则将其添加到数组中。

在 SUBQUERY() 完成后,使用 @count 属性聚合数组。如果有任何匹配项 (@count > 0),则出口的整体谓词将匹配正在测试的出口。

【讨论】:

  • 子查询太复杂了。
  • 另外,过滤所有类别然后检查计数效率低下。
  • 一个可行的解决方案太复杂了,但您没有其他选择吗?你的评论到底有什么意义?并且谓词变成了SQL,运行效率很高。为什么你不这么认为?
  • 查看我的答案以获得替代方案。问题中没有提到 SQL。
  • 我以为我在问题的某个地方读到了核心数据。我为此道歉。您的答案有一个不幸的问题,即实际上没有工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-23
相关资源
最近更新 更多