【问题标题】:ios - NSFetchResultsController error with sortDescriptorsios - 带有 sortDescriptors 的 NSFetchResultsController 错误
【发布时间】:2013-01-14 21:30:06
【问题描述】:

我有一个表格视图控制器,其中包含一个由 fetchResultsController 处理的 Formations 列表。

这是我的核心数据实体的样子:

我尝试按dateRange对我的 fetchResultsController 进行排序,如下所示:

// |fetchedResultsController| custom setter
- (NSFetchedResultsController *)fetchedResultsController {
    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

    _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:self.fetchRequest managedObjectContext:self.mainManagedObjectContext sectionNameKeyPath:@"dateRange" cacheName:kFormationsFetchedCacheName];
    _fetchedResultsController.delegate = self;

    return _fetchedResultsController;
}

// |fetchRequest| custom setter
- (NSFetchRequest *)fetchRequest {
    if (_fetchRequest != nil) {
        return _fetchRequest;
    }

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"student == %@", self.currentStudent];
    NSSortDescriptor *dateDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"dateRange" ascending:NO];
    NSSortDescriptor *nameDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:NO];

    _fetchRequest = [[NSFetchRequest alloc] initWithEntityName:kBSFormation];
    _fetchRequest.predicate = predicate;
    _fetchRequest.sortDescriptors = [NSArray arrayWithObjects: dateDescriptor, nameDescriptor, nil];

    return _fetchRequest;
}

当我尝试添加第一个 Formation 时,一切都很好,但对于接下来的,我有这些错误:

2013-01-30 22:43:08.370 [7202:c07] -[BSDateRange compare:]: unrecognized selector sent to instance 0x81781a0

2013-01-30 22:43:08.371 [7202:c07] CoreData: error: Serious application error.  Exception was caught during Core Data change processing.  This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification.  -[BSDateRange compare:]: unrecognized selector sent to instance 0x81781a0 with userInfo (null)

2013-01-30 22:43:08.372 [7202:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[BSDateRange compare:]: unrecognized selector sent to instance 0x81781a0'

如果我评论这一行:NSSortDescriptor *dateDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"dateRange" ascending:NO];,它可以工作,但我的表格视图很乱,因为sectionNameKeyPath 设置为dateRange

有人正在弄清楚这里的问题是什么? :/

【问题讨论】:

  • 跳出来的第一件事是你试图对关系而不是属性进行排序?
  • 是的,不知道是否允许这样做,但由于我也在我的部分中使用这种关系,我认为我必须使用相同的关系进行排序才能正确获取我的表格视图

标签: ios exception core-data nsfetchedresultscontroller nssortdescriptor


【解决方案1】:

您告诉它根据dateRange 关系进行排序。但是dateRange 是与BSDateRange 的关系,Core Data 如何比较它们?它应该使用from,还是to,或者它们的某种组合?您不能只告诉它对这样的对象进行排序,因为排序应该如何工作并不明显。

相反,首先弄清楚排序的含义。然后适当地修改您的排序描述符。例如,如果您决定排序取决于 from 值,请将排序描述符更改为使用 from 的键路径:

NSSortDescriptor *dateDescriptor = [NSSortDescriptor
    sortDescriptorWithKey:@"dateRange.from"
    ascending:NO];

如果您需要同时基于fromto 进行排序,请使用多个排序描述符。

【讨论】:

  • 实际上我已经尝试过使用date.fromdate.to 但我的表格视图仍然很乱:/ 但问题可能来自部分...我可以使用关系来声明我的部分吗? (sectionNameKeyPath:@"dateRange")
  • 我很确定你在使用dateRange 时也会遇到同样的问题。 NSFetchedResultsController 需要对部分进行排序,但它如何对 dateRange 实例进行排序?另外,请记住,节名称的文档说 “如果此键路径与 fetchRequest 中的第一个排序描述符指定的路径不同,则它们必须生成相同的相对排序。”您需要一个可排序的部分名称键路径。我不知道如果你传递了它无法排序的东西会发生什么。
  • 是的,我最终为我的“dateRange”实体添加了一个“名称”属性,并使用该属性对我的 fetchResultsController 进行排序/分段。感谢汤姆的帮助。
猜你喜欢
  • 1970-01-01
  • 2016-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
相关资源
最近更新 更多