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? 谢谢 :)


我自己的答案

NSManagedObject的方法isUpdated ,因此updated密钥名称的实体无效。

你不能忽略的方法

NSManagedObject自身定制了NSObject的许多功能,以便可以将被管理对象正确地集成到核心数据基础架构中。 核心数据依赖于NSManagedObject的实现下面的方法,你因此,绝对不能忽略的:primitiveValueForKey :, setPrimitiveValue:forKey :, :,的isEqual散,父类,类,自我,isProxy,isKindOfClass :, isMemberOfClass :, conformsToProtocol :, respondsToSelector :,managedObjectContext,实体,objectID,isInserted, isUpdated ,isDeleted,...

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


默认情况下,一个新的对象将始终插入到顶部。 如果您想自定义排序,您应该保留每个对象的索引。 然后你可以用任何方式对你的对象进行排序。


你也可以使用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
}
链接地址: http://www.djcxy.com/p/36133.html

上一篇: NSFetchedResultsController sorts in wrong order

下一篇: NSFetchRequest to show results in particular order