我正在尝试过滤一个基本上形成树形图形的对象数组。我想要做的是过滤掉这个可见属性为NO的数组中的所有对象,或者如果其父/祖父/ / visible属性为true(子对象可以使visible属性为YES,而其父对象可以为NO)。
我不清楚如何使用NSPredicate语法继续搜索父节点,直到没有父节点或找到visible属性为止。有没有办法解决这个问题?
答案 0 :(得分:1)
自从我提出这个问题以来已经有一段时间了,而且我认为我已经朝着我正在做的事情向另一个方向前进,但我现在有一些可能性来解决我当时想要的问题:
- (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:方法应该是一个简单的递归方法。