【问题标题】:NSFetchedResultsController - different sort order than section nameNSFetchedResultsController - 与部分名称不同的排序顺序
【发布时间】:2012-09-21 08:22:05
【问题描述】:

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

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

- (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;
}

【问题讨论】:

    标签: ios core-data nsfetchedresultscontroller


    【解决方案1】:

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

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

    另见“核心数据编程指南”中的Creating a Fetched Results Controller

    ... 在本例中,您将再添加一个 NSSortDescriptor 实例到 NSFetchRequest 实例。您从新排序中设置了相同的键 描述符作为 sectionNameKeyPath 的初始化 NSFetchedResultsController。获取的结果控制器使用这个 初始排序控制器将数据分成多个部分 因此要求键匹配。

    在您的情况下,您可以进行如下操作:

    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];
       }
      

    注意:如果您有多个对象具有相同的name 但不同的createAt 值,则这些对象将使用上述方法分组到不同的部分。不知道是不是你的问题。

    【讨论】:

    • 太棒了!这很容易。不,我也了解多个 sortDescriptor 的功能。目前我的对象的“名称”是唯一的,所以这个解决方案没有问题。也感谢您的代码。
    【解决方案2】:

    你快到了。您需要在 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"];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多