3

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

4

3 回答 3

3

我自己的答案

NSManagedObject 有它的方法isUpdated,所以实体的键名updated是无效的。

不能覆盖的方法

NSManagedObject 本身自定义了 NSObject 的许多特性,以便托管对象可以正确地集成到 Core Data 基础设施中。Core Data 依赖于 NSManagedObject 对以下方法的实现,因此您绝对不能覆盖这些方法:primitiveValueForKey:、setPrimitiveValue:forKey:、isEqual:、hash、超类、class、self、isProxy、isKindOfClass:、isMemberOfClass:、conformsToProtocol:、responsToSelector :, managedObjectContext, entity, objectID, isInserted, isUpdated , isDeleted, ...

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

于 2013-07-23T01:55:28.710 回答
1

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

于 2013-07-22T07:55:30.250 回答
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
}
于 2013-07-22T07:36:10.790 回答