【问题标题】:Can an NSPredicate search for an object within an array owned by an object in another array?NSPredicate 可以在另一个数组中的对象拥有的数组中搜索对象吗?
【发布时间】:2009-09-16 17:12:13
【问题描述】:

我已阅读 NSPredicate 文档,但无法完全理解它。我可以理解的简单谓词,但现在我如何为以下情况创建谓词:

我有一个 Foo 对象数组。在 Foo 类中,iVar 之一是 Bar 对象的 NSMutableArray。我需要过滤 Foo 对象的数组以获取那些在其数组中具有特定 Bar 对象的对象。怎么样?

另外,是否更容易(或可能)一次找到多个 Bar 对象,或者组合多个谓词来搜索特定的 Bar?

【问题讨论】:

  • 为什么要使用 NSPredicate?
  • 过滤数组。理论上可以应用的过滤器数量是无限的,并且需要将它们组合在一起,这似乎正是 filtersArrayUsingPredicate: 方法存在的原因。

标签: iphone objective-c


【解决方案1】:

您的问题可以分为两个问题,我会尝试按顺序回答。

  1. 您可以在Foo 实例上定义一个谓词,该谓词仅在该实例的Bar 对象数组包含与单独谓词匹配的Bar 实例时才为真。你想要的是一个[SUBQUERY][1] 表达式。像这样的谓词字符串将匹配 Foo 实例的 fooInt 值为 10 和 barArray 属性中的 Bar 实例的 barInt 值为 1:

    @"fooInt==10 && SUBQUERY(barArray, $x, $x.barInt == 1).@count > 0"

    SUBQUERY 表达式的一般格式是SUBQUERY(collection, $var, predicate)SUBQUERY 表达式返回 collection 中与 predicate 匹配的对象集合,因此采用 @count 将告诉您 Foo 实例是否具有与子查询谓词匹配的 Bar 实例。

  2. 您可以在SUBQUERY 表达式中包含任意复杂的谓词(包括嵌套的SUBQUERY 表达式)。鉴于包含 SUBQUERY 表达式的谓词通常执行起来很昂贵(它们大致对应于 SQL JOIN),最好使用 OR 在一个 SUBQUERY 表达式中搜索多个 Bar 实例,然后测试适当的@countSUBQUERY 的结果中。像

    这样的谓词字符串

    @"fooInt==10 && SUBQUERY(barArray, $x, $x.barInt == 1 || $x.barInt==2).@count >= 2"

    将在Foo 实例的barArray 中找到具有Bar 实例和barInt==1 的Bar 实例和barInt==2 的Foo 实例。

【讨论】:

    【解决方案2】:

    我找到了我要找的东西:

    @class Foo {
      int var1;
      NSArray *barObjs;
    }
    
    predicate = @"var1 == 5 AND ANY barObjs.id == 5";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-10
      • 2020-07-22
      • 2017-08-29
      • 2020-04-06
      • 2018-10-04
      • 2021-09-07
      相关资源
      最近更新 更多