最终目标:我有一个由叶子组成的对象图,连接到其他叶子。我需要遍历对象图并返回所有那些没有枯萎的叶子,或者 1)没有子叶子或 2)所有子叶子都枯萎了。
情况:我有一个 NSFetchedResultsController 和表格视图,我想在其中显示结果。
我尝试过的:我开始尝试在 NSFetchRequest 上使用 NSPredicate,但意识到我无法看到哪个可以递归地遍历叶子的子叶子及其所有子叶子等...
因此,我向 Leaf 对象添加了一个名为“isFarthestNonWiltedLeaf”的属性,并在 Leaf 上的一个类别内创建了一个自定义 get-accessor:
- (NSNumber*) isFarthestNonWiltedLeaf
{
[self willAccessValueForKey:@"isFarthestNonWiltedLeaf"];
NSNumber *returnValue = @([self.wilted boolValue] == NO && [[self allSubLeavesAreWilted] boolValue]);
[self didAccessValueForKey:@"isFarthestNonWiltedLeaf"];
return returnValue;
}
- (NSNumber*) allSubLeavesAreWilted
{
for(Leaf *aLeaf in self.subLeaves)
{
if([aLeaf.wilted boolValue] == NO || ![[aLeaf allSubLeavesAreWilted] boolValue])
return @NO;
}
return @YES;
}
然后,在 NSFetchedResultsController 的获取请求中,我设置了以下谓词:
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"isFarthestNonWiltedLeaf == YES"]];
这在我第一次打开应用程序并开始在不同的视图中添加叶子和子叶子时效果很好。但是,下次我打开应用程序时,自定义访问器方法在第一次出现表格视图时没有被访问!我必须去每个叶子并检查/取消选中它的“枯萎”状态,然后让 NSFetchedResultsController 刷新那个单一的叶子......此时它确实调用了自定义 isFarthestNonWiltedLeaf 访问器并且叶子正确地出现在列表中。我必须为每个叶子执行此操作,才能正确更新整个 tableview。
所以我的问题是......我如何让 NSFetchRequest / NSFetchedResultsController 每次都使用 Leaf 对象的自定义 get 访问器?谢谢你。