一个可以递归遍历对象图的NSPredicate?

时间:2010-02-18 00:21:20

标签: objective-c nspredicate

我正在尝试过滤一个基本上形成树形图形的对象数组。我想要做的是过滤掉这个可见属性为NO的数组中的所有对象,或者如果其父/祖父/ / visible属性为true(子对象可以使visible属性为YES,而其父对象可以为NO)。

我不清楚如何使用NSPredicate语法继续搜索父节点,直到没有父节点或找到visible属性为止。有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:1)

自从我提出这个问题以来已经有一段时间了,而且我认为我已经朝着我正在做的事情向另一个方向前进,但我现在有一些可能性来解决我当时想要的问题:

  • 让visible属性方法以递归方式运行,而不是使格式谓词执行此操作。 这可以这样完成:
- (BOOL) isVisible {
  return visible && [parent isVisible];
}

//...
id filtered = [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"visible == YES"]];
  • 使用块谓词而不是格式谓词来执行递归遍历:
[array filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {

    id obj = evaluatedObject;
    while (obj) {
      if (![obj isVisible]) return NO;
      obj = [obj parent];
    }
    return YES;
}]];

或两者的结合(我认为这是最强大和可读的)。

答案 1 :(得分:0)

我不确定你想用一个简单的单一谓词做什么。如果它是一棵树并且您正在使用谓词来获取节点,那么您需要并编写一个将向上遍历的方法,并返回一个BOOL,指示是否应该删除它。

然后,只需获取节点并将它们放入NSMutableArray并执行

for (int i = 0; i < [results count]; i++)
{
    if ([self shouldBeRemoved:[results objectAtIndex:i]])
    {
        [results removeObjectAtIndex:i];
        i--;
    }
}

你的shouldBeRemoved:方法应该是一个简单的递归方法。