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