gpt4 book ai didi

ios - NSFetchedResultsController:如何从实体的多对多关系中获取sectionName

转载 作者:行者123 更新时间:2023-12-02 03:01:37 24 4
gpt4 key购买 nike

我有一个这样的核心数据模型: ParentObject <--->> ChildObject

两者ParentObjectChildObject有一个属性 levelNumber如:

typedef enum {
Primary,
Secondary,
Tertiary
} LevelNumber;

我还有一个方法可以将 ParentObject 和 childObject 中的级别号从 int 转换为字符串:

-(void) levelString
{
switch(self.levelNumber)
{
case Primary: return @"Primary";
case Secondary: return @"Secondary";
case Tertiary: return @"Tertiary";
default: return @"Error";

}

}

现在我在表格 View 中有一个 FetchedResultsController,其中列出了 ParentObject 。我想要在部分名称中获取的内容是:

  • 如果 ParentObjectSecondaryTertiary , 显示该部分名称为SecondaryTertiary .
  • 如果 ParentObjectPrimaryChildObjects 中的任何一个是SecondaryTertiary ,将节名称显示为 SecondaryTertiary .
  • 如果 ParentObject和所有ChildObjectsPrimary ,将节名称显示为 Primary

如果我只需要查看 levelNumber 就非常简单了ParentObject的,如下所示-

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"ParentObject"];
NSSortDescriptor *levelNumSD = [NSSortDescriptor sortDescriptorWithKey:@"levelNumber" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObjects:levelNumSD, nil];

self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:myContext
sectionNameKeyPath:@"levelString"
cacheName:nil];

据我了解,FRC 中的限制是 SortDescriptor 的结果应按照希望显示的顺序返回结果。我怎样才能合并ChildObject也在这里检查。它会是一种新的 SortDescriptor,还是其他什么?

最佳答案

看看Apple的示例代码DateSectionTitles它解释了如何将日期作为部分,并且您也可以在您的案例中使用它。您在 titleForSection 中管理的字符串的实际显示,但您在数据库中保留一个“原始”且可排序的属性,称为 sectionIdentifier

在您的特定情况下,部分标识符就像 levelNumber 一样,只需返回所有子项中最高的 levelNumber 即可计算。

模式如下:

-(NSString*)sectionIdentifier {
[self willAccessValueForKey:@"sectionIdentifier"];
NSNumber *tmp = [self primitiveSectionIdentifier];
[self didAccessValueForKey:@"sectionIdentifier"];

if (!tmp) {
NSNumber *childrenMax = [self valueForKeyPath:@"@max.children.levelNumber"];
tmp = childrenMax.intValue > self.levelNumber.intValue ?
childrenMax : self.levelNumber;
[self setPrimitiveSectionIdentifier:tmp];
}

return tmp;
}

如果实体发生变化,请不要忘记重置它。

-(void)setLevelNumber:(NSNumber)newNumber {
[self willChangeValueForKey:@"levelNumber"];
[self setPrimitiveLevelNumber:newNumber];
[self willChangeValueForKey:@"levelNumber"];

[self setPrimitiveSectionIdentifier:nil];
}

最后,确保相关数据发生变化时失效:

+(NSSet*) keyPathsForValuesAffectingSectionIdentifier {
return [NSSet setWithObject:@"levelNumber"];
}

要监视任何子级的 levelNumber 变化,请让父级监听 NSManagedObjectContextDidSaveNotification 并查看其任何子级是否在该保存中。

关于ios - NSFetchedResultsController:如何从实体的多对多关系中获取sectionName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17378366/

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