NSFetchedResultsController并获得分组的权利

我有以下问题。 我有一个由NSFetchedResultsController支持的UITableview。 它应该显示让我们说一个项目,文件夹和文件。 没有比这更大的等级。 所以一个项目有几个文件夹,并有几个文件。 现在我的表格视图应该显示这些文件,按文件夹分组。

所以我认为我的提取请求的谓词只是:

[NSPredicate predicateWithFormat:@"folder.project = %@", self.project]; 

然后我会使用MagicalRecord来创build一个NSFetchedResultsController:

 [File fetchAllGroupedBy:@"folder.name" withPredicate:sectionPredicate sortedBy:@"folder.name" ascending:YES]; 

这基本上与一个大问题的工作…如果文件夹中没有文件,我不会得到该文件夹​​的一部分(我需要!!!!)

所以我需要的是tableview也显示空文件夹的部分标题:

 Folder A File 1 File 2 Folder B Folder C File 3 

我可以做到这一点没有NSFetchedResultsController,但我喜欢它处理插入/删除行和部分如此好,它观察到的变化…

Thx帮忙,干杯,Georg

解决scheme确实有点复杂。 我将尝试和解释一个部分的解决scheme(没有嵌套的文件夹,而不是部分sorting顺序的支持)

模型更改:
1)将Folder的父实体设置为File (如果使用虚拟项目,则不需要)。
2)将BOOL字段isFinalFile实体。
3)为实体生成类文件。
4)在Folder.h实现-awakeFromInsert像这样:

 - (void) awakeFromInsert { self.isFinal = YES; self.folder = self;//You could also fabricate a dummy item } 

FetchedResultsController:
1)像这样设置你的获取请求:

 NSFetchRequest* request = [[NSFetchRequest alloc] initWithEntityName:@"File"]; NSSortDescriptor* terminalSort = [NSSortDescriptor sortDescriptorWithKey:@"isFinal" ascending:YES]; NSSortDescriptor* nameSort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]; [request setSortDescriptors:@[terminalSort,nameSort]]; [request setPredicate:[NSPredicate predicateWithFormat:@"folder.project == %@",project]] //Any additional settings 

2)像这样初始化你的FRC:

 self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"folder"//or @"folder.<some unique property>" cacheName:nil]; 

请注意, sectionNameKeyPath设置为folder ,而不是folder.name以支持具有相同名称的文件夹(如果不需要,并且文件夹名称是唯一的,请使用folder.name

3)在你的-controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:在方法的开始添加:

 File* file = (File*)anObject; if (file.isFinal) { return; } 

表视图:
1)执行:

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { id <NSFetchedResultsSectionInfo> sectionInfo = [self.fetchedResultsController sections][section]; return [sectionInfo numberOfObjects] - 1; } 

2)执行:

 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { id<NSFetchedResultsSectionInfo> sec = [self.fetchedResultsController sections][section]; return [[[[sec objects] objectAtIndex:0] folder] name]; } 

这应该给你你需要的基本function。 为了支持更复杂的行为,还需要进行其他更改。