2010-02-18 138 views
3

我想过滤基本上形成树型图形的对象数组。我想要做的是过滤掉这个数组中可见属性为NO的所有对象,或者它的父/祖父/ etc可见属性为真(子对象可以将可见属性设置为YES,而其父母可以为NO)。可递归遍历对象图的NSPredicate?

我不清楚我会如何去使用NSPredicate语法来继续搜索父节点,直到没有父母或可见属性被发现。有什么办法可以解决这个问题吗?

回答

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; 
}]]; 

或者一个组合这两个(这将是我认为最健壮和可读的)。

0

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

然后,只是让你的节点并把它们放在一个NSMutableArray,并做了

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

你shouldBeRemoved:方法应该是相当直接的递归方法。