Iphone NSPredicate能否在另一个数组中的对象所拥有的数组中搜索对象?

Iphone NSPredicate能否在另一个数组中的对象所拥有的数组中搜索对象?,iphone,objective-c,Iphone,Objective C,我已经阅读了NSPredicate文档,一路上都无法理解它。我可以理解简单的谓词,但现在如何为以下情况创建谓词: 我有一个Foo对象数组。在Foo类中,其中一个ivar是一个nsmutablebar对象数组。我需要过滤Foo对象的数组,以获得在其数组中具有特定Bar对象的对象。怎么做 另外,一次找到多个Bar对象是否更容易(或可能),或者组合多个谓词,每个谓词搜索一个特定的Bar?您的问题可以分为两个问题,我将尝试按顺序回答它们 您可以在Foo实例上定义谓词,只有当实例的Bar对象数组包含与单独

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

我有一个Foo对象数组。在Foo类中,其中一个ivar是一个nsmutablebar对象数组。我需要过滤Foo对象的数组,以获得在其数组中具有特定Bar对象的对象。怎么做


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

您的问题可以分为两个问题,我将尝试按顺序回答它们

  • 您可以在
    Foo
    实例上定义谓词,只有当实例的
    Bar
    对象数组包含与单独谓词匹配的
    Bar
    实例时,该谓词才为true。您需要的是一个
    [SUBQUERY][1]
    表达式。这样的谓词字符串将使
    Foo
    实例与
    fooInt
    值10匹配,并与
    barArray
    属性中的
    Bar
    实例匹配,该属性的
    barInt
    值为1:

    @“fooInt==10&&子查询(barArray,$x,$x.barInt==1)。@count>0”

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

  • 子查询
    表达式中可以有任意复杂的谓词(包括嵌套的
    子查询
    表达式)。考虑到包含子查询表达式的谓词通常执行起来很昂贵(它们大致对应于SQL
    JOIN
    ),使用
    在一个
    子查询
    表达式中搜索多个
    实例,然后在
    子查询
    的结果中测试适当的
    @count
    。类谓词字符串

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

    将在
    Foo
    实例的
    barInt
    ==1的
    Bar
    实例和
    barInt
    实例的
    barray
    中查找
    Foo
    实例


  • 你的问题可以分为两个问题,我试着按顺序回答

  • 您可以在
    Foo
    实例上定义谓词,只有当实例的
    Bar
    对象数组包含与单独谓词匹配的
    Bar
    实例时,该谓词才为true。您需要的是一个
    [SUBQUERY][1]
    表达式。这样的谓词字符串将使
    Foo
    实例与
    fooInt
    值10匹配,并与
    barArray
    属性中的
    Bar
    实例匹配,该属性的
    barInt
    值为1:

    @“fooInt==10&&子查询(barArray,$x,$x.barInt==1)。@count>0”

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

  • 子查询
    表达式中可以有任意复杂的谓词(包括嵌套的
    子查询
    表达式)。考虑到包含子查询表达式的谓词通常执行起来很昂贵(它们大致对应于SQL
    JOIN
    ),使用
    在一个
    子查询
    表达式中搜索多个
    实例,然后在
    子查询
    的结果中测试适当的
    @count
    。类谓词字符串

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

    将在
    Foo
    实例的
    barInt
    ==1的
    Bar
    实例和
    barInt
    实例的
    barray
    中查找
    Foo
    实例


  • 我找到了我要找的东西:

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

    我找到了我要找的东西:

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

    为什么要使用NSPredicate?来筛选数组。从理论上讲,可以应用无限多个筛选器,它们需要组合在一起,这似乎就是FilteredarrayingPredicate:方法存在的确切原因。为什么要使用NSPredicate?来筛选数组。理论上,可以应用的过滤器数量是无限的,它们需要组合在一起,这似乎就是FilteredarrayingPredicate:方法存在的确切原因。