ios-NSFetchResultsController与sortDescriptors一起出错
我有一个表视图控制器,其中包含由fetchResultsController处理的表单列表 以下是我的核心数据实体的外观: 我尝试按日期范围对fetchResultsController进行排序,如下所示: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)
// |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进行排序/分区。谢谢你的帮助,汤姆。