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

时间:2015-08-10 21:35:48

标签: ios objective-c sorting nsfetchedresultscontroller nssortdescriptor

NSSortDescriptor的方法为sortDescriptorWithKey:ascending:selector:

这将对象进行排序,查找对象是key的键值编码属性,然后将该属性发送给所述选择器。

我宁愿发送对象本身选择器,也可以通过其中一种方法直接对对象进行排序。

我尝试了密钥@"self",但失败时出现以下错误:

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

'NSInvalidArgumentException',原因:'在实体中找不到keypath #self

有没有办法使用对象的方法之一进行排序,而不是使用其中一个属性?

(顺便说一句,由于核心数据,我无法使用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;

1 个答案:

答案 0 :(得分:3)

您可以NSSortDescriptor使用self密钥,它可以正常工作。

但是如果您使用自定义类,则应该覆盖类的isEqual:hash函数

核心数据更新:

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

使用核心数据时,NSSortDescriptor密钥路径必须是自定义NSManagedObject类的核心数据属性/关系。

我建议您为类MYClass创建一个单独的属性,称为order数字或字符串类型,并在类更改时更新它。然后,您可以使用此属性在NSFetchedResultsController中进行排序。