可以使用 "self" 和 NSSortDescriptor 来按对象本身排序,而不是对象的 属性? (核心数据/NSFetchedResultsController)

Possible to use "self" with NSSortDescriptor to sort by the object itself, rather than object's property? (Core Data / NSFetchedResultsController)

NSSortDescriptor 有方法 sortDescriptorWithKey:ascending:selector:.

这会获取正在排序的对象,找到对象的 key 的键值编码 属性,然后将 属性 发送到指定的选择器。

我想将 对象本身 发送给选择器,以通过其中一种方法直接对对象进行排序。

我试过密钥 @"self",但失败并出现以下错误:

[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES selector:@selector(compare:)]; 

'NSInvalidArgumentException', reason: 'keypath #self not found in entity

有什么方法可以使用对象的方法之一而不是 属性 的方法之一进行排序吗?

(顺便说一句,由于核心数据,我不能使用 sortDescriptorWithKey:ascending:comparator:。这也将与 NSFetchedResultsController 和委托一起使用。)

编辑:

我想做的事情的完整代码,使用 Core Data + NSFetchRequest:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"MYClass" inManagedObjectContext:ManagedObjectContext]];
[request setFetchBatchSize:20];

// This is where I am having the problem. Self?
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES selector:@selector(compare:)];
[request setSortDescriptors:@[sortDescriptor]];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"hidden != %@", @YES];
[request setPredicate:predicate];

NSFetchedResultsController *newController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:[[ATBackend sharedBackend] managedObjectContext] sectionNameKeyPath:@"sectionKeyPath" cacheName:@"myCache"];

newController.delegate = self;
_fetchedMessagesController = newController;

您可以使用NSSortDescriptor键和self键,它可以正常工作。

但是如果您使用自定义 class,您应该覆盖 class

isEqual:hash 函数

核心数据更新:

在你的情况下,我描述的方法可能不起作用,看起来像 NSFetchedResultsController 并且数组使用不同的排序描述符。

对于 Core Data,NSSortDescriptor 关键路径必须是自定义 NSManagedObject class.

的 Core Data property/relationship

我建议你为你的 class MYClass 创建一个单独的 属性 ,称为 order 数字或字符串类型,并在 [=35= 时更新它] 确实变了。然后你可以使用这个 属性 在 NSFetchedResultsController.

中排序