我正在开发一个基于Xcode的CoreData示例的项目。我有一个名为Entity
的实体类,其中updated
键存储实体更新的时间戳,NSFetchResultsController设置为按降序排序:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; [fetchRequest setEntity:[NSEntityDescription entityForName:@"Entity" inManagedObjectContext:_managedObjectContext]]; [fetchRequest setFetchBatchSize:20]; [fetchRequest setSortDescriptors:@[[[NSSortDescriptor alloc] initWithKey:@"updated" ascending:NO]]]; NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:_managedObjectContext sectionNameKeyPath:nil cacheName:nil];
这在初始加载时工作正常,但是当我插入应插入其他对象之间的NSManagedObject时,它会插入到顶部。当我重新启动应用程序时,它会插入到正确的位置。
例如:最初表格如下:
updated: 300
updated: 200
updated: 100
当我插入ManagedObject:updated: 250
时,我希望该表看起来像:
updated: 300
updated: 250 <-- inserted here
updated: 200
updated: 100
但这就是我得到的:
updated: 250 <-- inserted at the top
updated: 300
updated: 200
updated: 100
这是NSFetchResultsController的工作方式,还是有办法在每个插入上重新排序所有NSManagedObjects?谢谢:))
答案 0 :(得分:3)
我自己的回答
NSManagedObject拥有方法isUpdated
,因此拥有密钥名称updated
的实体无效。
您不得覆盖的方法
NSManagedObject本身定制了NSObject的许多功能 托管对象可以正确地集成到核心数据中 基础设施。 Core Data依赖于NSManagedObject的实现 以下方法,你绝对不能这样做 override:primitiveValueForKey:,setPrimitiveValue:forKey:,isEqual:, hash,superclass,class,self,isProxy,isKindOfClass:, isMemberOfClass:,conformsToProtocol:,respondsToSelector:, managedObjectContext,entity,objectID,isInserted, isUpdated , isDeleted,...
答案 1 :(得分:1)
默认情况下,新对象始终会插入到顶部。如果要自定义排序,则应保留每个对象的索引。然后,您可以以任何方式对对象进行排序。
答案 2 :(得分:0)
您也可以使用NSArray对委托方法进行排序
-(void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
NSArrary *resultsArray = [controller allObjects];
// sort
NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"updated" ascending:NO];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray;
sortedArray = [reultsArray sortedArrayUsingDescriptors:sortDescriptors];
// reload table using this array
}