NSFetchedResultsController按错误顺序排序

时间:2013-07-22 06:59:51

标签: ios nsfetchedresultscontroller

我正在开发一个基于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?谢谢:))

3 个答案:

答案 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,...

http://developer.apple.com/library/ios/#documentation/cocoa/Reference/CoreDataFramework/Classes/NSManagedObject_Class/Reference/NSManagedObject.html

答案 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
}