NSFetchedResultsController - 与节名称不同的排序顺序

时间:2012-09-29 22:35:33

标签: ios core-data nsfetchedresultscontroller

我有一个NSManagedObject用于分组的UITableView中的部分。 该对象具有“name”和“createdAt”属性。 我想在te UI中使用“name”作为节标题,但是按“createdAt”排序。 根据文档,第一个sortDescriptor键也必须是NSFetchedResultsController的sectionNameKeyPath。

我建议使用两个sortDescriptors,但它不起作用。这些部分仍按名称排序。

- (NSFetchedResultsController *)fetchedResultsController {
  if (_fetchedResultsController != nil) {
      return _fetchedResultsController;
  }

  NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
  NSEntityDescription *entity = [NSEntityDescription entityForName:@"Object" inManagedObjectContext:[CoreDataHelper instance].managedObjectContext];
  [fetchRequest setEntity:entity];

  NSSortDescriptor *sortName = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
  NSSortDescriptor *sortDate = [[NSSortDescriptor alloc] initWithKey:@"createdAt" ascending:YES];

  [fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortName, sortDate, nil]];

  [fetchRequest setFetchBatchSize:20];

  NSFetchedResultsController *theFetchedResultsController =
  [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                    managedObjectContext:[CoreDataHelper instance].managedObjectContext sectionNameKeyPath:@"name"
                                               cacheName:@"Root"];
  self.fetchedResultsController = theFetchedResultsController;

  return _fetchedResultsController;
}

2 个答案:

答案 0 :(得分:38)

获取的结果控制器(FRC)仅使用第一个排序描述符将对象分组(并排序)为多个部分。可以添加第二个排序描述符来对每个部分中的对象进行排序。

此外,排序描述符的关键路径必须与FRC的sectionNameKeyPath相同(或者至少生成相同的相对排序)。

在您的情况下,您可以按以下步骤操作:

  1. 在第一个排序描述符中使用createdAt作为sectionNameKeyPath
  2. 修改titleForHeaderInSection委托函数以返回name属性,而不是createdAt

    - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
        id <NSFetchedResultsSectionInfo> sectionInfo = [[self.controller sections] objectAtIndex:section];
        return [[[sectionInfo objects] objectAtIndex:0] name];
    }
    
  3. 注意:如果您有多个具有相同name但不同createAt值的对象,则可以使用上述方法将这些对象分组到不同的部分。我不知道这对你来说是否有问题。

答案 1 :(得分:0)

你快到了。您需要在initWithFetchRequest调用中定义sectionNameKeypath。

    NSSortDescriptor *sortDate = [[NSSortDescriptor alloc] initWithKey:@"createdAt" ascending:YES];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDate]];

    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[CoreDataHelper instance] sectionNameKeyPath:@"name"];