ios - 使用sortDescriptors的NSFetchResultsController错误

时间:2013-01-30 21:58:28

标签: ios exception core-data nsfetchedresultscontroller nssortdescriptor

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

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

enter image description here

我尝试按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

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

1 个答案:

答案 0 :(得分:2)

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

相反,首先找出排序甚至意味着什么。然后适当地修改排序描述符。例如,如果您确定排序取决于from值,请更改排序描述符以使用from的关键路径:

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

如果您需要根据fromto进行排序,请使用多个排序描述符。