gpt4 book ai didi

ios - 核心数据 : Custom attribute accessor not accessed the first time NSManagedObject is loaded

转载 作者:行者123 更新时间:2023-12-01 16:54:40 25 4
gpt4 key购买 nike

最终目标 :我有一个由叶子组成的对象图,连接到其他叶子。我需要遍历对象图并返回所有那些没有枯萎的叶子,或者 1)没有子叶子或 2)所有子叶子都枯萎了。

情况 :我有一个 NSFetchedResultsController 和表格 View ,我想在其中显示结果。

我试过的 :
我开始尝试在 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"]];

这在我第一次打开应用程序并开始在不同的 View 中添加叶子和子叶子时效果很好。但是,下次我打开应用程序时,自定义访问器方法在第一次出现表格 View 时没有被访问!我必须去每个叶子并检查/取消选中它的“枯萎”状态,然后让 NSFetchedResultsController 刷新那个单一的叶子......此时它确实调用了自定义 isFarthestNonWiltedLeaf 访问器并且叶子正确地出现在列表中。我必须为每个叶子执行此操作,才能正确更新整个 tableview。

所以我的问题是......我如何让 NSFetchRequest/NSFetchedResultsController 每次都使用 Leaf 对象的自定义 get 访问器?谢谢你。

最佳答案

好吧,我将不得不回答我自己的问题......我玩了更多,我发现了这个问题,尽管我仍然不确定它的“原因”。

我意识到 CoreData 中有很多缓存正在进行,所以即使我在 NSFetchedResultsController 上将 cacheName 设置为 nil,我还是觉得那里有一些问题。此外,似乎在没有调用 get 访问器的情况下访问了原始属性。

换句话说,原语需要被保存。所以我添加了以下几行 在获取访问器 在计算值之后:

[self setPrimitiveValue:returnValue forKey:@"isFarthestNonWiltedLeaf"];

起初我还添加了 KVO 通知代码(willChangeValueForKey 和 didChangeValueForKey),但这使得应用程序完全没有响应,出于某种原因......这似乎是一些周期性引用问题。

所以最终的代码是这样的:
- (NSNumber*) isFarthestNonWiltedLeaf
{
[self willAccessValueForKey:@"isFarthestNonWiltedLeaf"];
NSNumber *returnValue = @([self.wilted boolValue] == NO && [[self allSubLeavesAreWilted] boolValue]);
[self didAccessValueForKey:@"isFarthestNonWiltedLeaf"];

[self setPrimitiveValue:returnValue forKey:@"isFarthestNonWiltedLeaf"];

return returnValue;
}

- (NSNumber*) allSubLeavesAreWilted
{
for(Leaf *aLeaf in self.subLeaves)
{
if([aLeaf.wilted boolValue] == NO || ![[aLeaf allSubLeavesAreWilted] boolValue])
return @NO;
}
return @YES;
}

...使用 NSPredicate 如下:
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"isFarthestNonWiltedLeaf == YES"]];

关于ios - 核心数据 : Custom attribute accessor not accessed the first time NSManagedObject is loaded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12770944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com