ios-NSFetchResultsController与sortDescriptors一起出错

ios-NSFetchResultsController与sortDescriptors一起出错,ios,exception,core-data,nsfetchedresultscontroller,nssortdescriptor,Ios,Exception,Core Data,Nsfetchedresultscontroller,Nssortdescriptor,我有一个表视图控制器,其中包含由fetchResultsController处理的表单列表 以下是我的核心数据实体的外观: 我尝试按日期范围对fetchResultsController进行排序,如下所示: // |fetchedResultsController| custom setter - (NSFetchedResultsController *)fetchedResultsController { if (_fetchedResultsController != nil)

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

以下是我的核心数据实体的外观:

我尝试按日期范围对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;
}
当我尝试添加第一个
组时,一切都很好,但对于下一个组,我有以下错误:

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”升序:否]
,它正在工作,但我的表视图很混乱,因为
sectionNameKeyPath
设置为
日期范围


有人在想这里有什么问题吗/

您告诉它根据
dateRange
关系进行排序。但是
dateRange
BSDateRange
有关系,核心数据如何比较它们?它应该使用
from
,或者可能是
to
,或者这些的一些组合?你不能只告诉它在这样一个对象上排序,因为排序应该如何工作还不清楚

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

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

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

首先跳出来的是,您试图根据关系而不是属性进行排序?是的,不知道这是否允许,但由于我也在我的部分中使用此关系,我认为我必须使用相同的关系进行排序,才能正确获取表视图。实际上,我已经尝试了
date.from
date.to
,但我的表视图仍然很混乱:/但是问题可能来自于部分。。。我可以使用关系声明我的分区吗?(
sectionNameKeyPath:@“dateRange”
)我敢肯定,使用
dateRange
进行节操作也会遇到同样的问题。
NSFetchedResultsController
需要对节进行排序,但它如何对
dateRange
实例进行排序?另外,请记住,节名的文档中说“如果此密钥路径与fetchRequest中第一个排序描述符指定的密钥路径不同,则它们必须生成相同的相对顺序。”您需要一个可排序的节名密钥路径。我不知道如果你传递一些它无法排序的东西会发生什么。是的,我最后向我的“dateRange”实体添加了一个“name”属性,并用这个属性对我的fetchResultsController进行排序/分区。谢谢你的帮助,汤姆。