一个可以递归遍历对象图的 NSPredicate?
Posted
技术标签:
【中文标题】一个可以递归遍历对象图的 NSPredicate?【英文标题】:An NSPredicate that can recursively traverse an object graph? 【发布时间】:2010-02-18 00:21:20 【问题描述】:我正在尝试过滤本质上形成树形图的对象数组。我想要做的是从这个数组中过滤掉所有可见属性为NO的对象,或者如果它的父/祖父/等可见属性为真(子对象的可见属性可以是YES,而其父对象可以是NO)。
我不清楚我将如何使用 NSPredicate 语法来继续搜索父节点,直到没有父节点或找到可见属性。有没有办法解决这个问题?
【问题讨论】:
【参考方案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; ]];
或两者的结合(我认为这将是最健壮和可读的)。
【讨论】:
【参考方案2】:我不确定您希望通过一个简单的单个谓词执行什么操作。如果它是一棵树,并且您使用谓词来获取节点,那么您需要编写一个向上遍历并返回一个 BOOL 指示是否应该删除它的方法。
然后,只需获取您的节点并将它们放入 NSMutableArray 并执行
for (int i = 0; i < [results count]; i++)
if ([self shouldBeRemoved:[results objectAtIndex:i]])
[results removeObjectAtIndex:i];
i--;
你的 shouldBeRemoved: 方法应该是一个非常简单的递归方法。
【讨论】:
以上是关于一个可以递归遍历对象图的 NSPredicate?的主要内容,如果未能解决你的问题,请参考以下文章