NSFetchedResultsController按多个键排序表视图节

时间:2013-10-30 03:57:40

标签: ios uitableview core-data nsfetchedresultscontroller

问题

在我的CoreData模型中,我有两个名为List和Item的实体,它们具有一对多的关系。我当前的设计中有两种类型的List,系统列表和用户列表。系统列表由系统在第一次启动时创建,用户列表将由用户随时创建。

在我的TVC中,我想呈现按其相关列表分组的所有项目(使用列表名称作为章节标题),此外,我希望所有系统列表始终放在用户列表的顶部。

例如,考虑我在DB中拥有列表的所有实例,如下所示:

系统列表:收件箱

用户列表: FruitList ShoppingList

预期结果将是:

  • 收件箱
    • InboxItem1
    • InboxItem2
  • FruitList
    • FruitListItem1
  • ShoppingList
    • 苹果

方法:

使用FRC,我可以通过将sectionNameKeyPath设置为“list_name”到FRC来实现第一个目标。但我修复系统列表的位置有问题(在这种情况下,收件箱,它应该始终在索引0)。但是,当用户输入名称以“A” - “J”开头的列表并且所有这些列表将放在收件箱之上时,问题就出现了,我确实尝试通过添加“ list_type“作为辅助排序键,但它不起作用。

NSFetchRequest *requst = [[NSFetchRequest alloc]initWithEntityName:ENTITY_ITEM];

NSArray *sortDescriptors = @[
                                [NSSortDescriptor sortDescriptorWithKey:@"belongsToList.list_name" ascending:YES],
                                [NSSortDescriptor sortDescriptorWithKey:@"belongsToList.list_type" ascending:NO]];

requst.sortDescriptors = sortDescriptors;
requst.predicate = [self predicateForListType:type selectedList:list];
requst.fetchBatchSize = 20;

_fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:requst managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"belongsToList.list_name" cacheName:nil];

临时解决方案:

我能想到解决这个问题的临时解决方案是在列表名称中添加前缀字符串,并将它们作为另一个属性存储在DB中,并将其用作sectionNameKeyPath。

e.g。 “0-” - 表示系统列表(“收件箱” - >“0-Inbox”)

“1-” - 用户列表(“ShoppingList” - >“1-ShoppingList”)

并删除-tableView:titleForHeaderInSection:中的前缀。但是这个解决方案会带来开销,我认为应该有更好的解决方案,因为这是所有开发人员在处理FRC和TBV时都会遇到的常见问题。

任何输入?? !!!

1 个答案:

答案 0 :(得分:1)

您可以将sectionIdentifier等瞬态属性添加到List实体,并按如下方式排序:使用

[NSSortDescriptor sortDescriptorWithKey:@"list.sectionIdentifier" ascending:YES]

作为第一个排序描述符。

sectionIdentifier可以是任何按你想要的方式排序的东西(首先是“系统”),你可以从中重建正确的部分名称以便在titleForHeaderInSection中返回。