NSSortDescriptor 有方法sortDescriptorWithKey:ascending:selector:
。
这会获取正在排序的对象,找到对象的 key
键值编码属性,然后将该属性发送到指定的选择器。
我想将对象本身发送给选择器,以通过其中一种方法直接对对象进行排序。
我尝试了 @"self"
键,但失败并出现以下错误:
[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES selector:@selector(compare:)];
'NSInvalidArgumentException', reason: 'keypath #self not found in entity
有没有办法使用对象的方法之一而不是属性的方法之一进行排序?
(顺便说一句,由于 Core Data,我不能使用 sortDescriptorWithKey:ascending:comparator:
。这也将与 NSFetchedResultsController
和委托(delegate)一起使用。)
编辑:
我想做的事情的完整代码,使用 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
键,它可以正常工作。
但是如果你使用自定义类,你应该覆盖你类的isEqual:
和hash
函数
核心数据更新:
在您的情况下,我描述的方法可能不起作用,看起来像 NSFetchedResultsController
并且数组使用不同的排序描述符。
对于 Core Data,NSSortDescriptor
键路径必须是自定义 NSManagedObject
类的 Core Data 属性/关系。
我建议您为类 MYClass
创建一个单独的属性,称为数字或字符串类型的 order
,并在类发生变化时更新它。然后您可以在 NSFetchedResultsController
中使用此属性进行排序。
关于ios - 可以将 "self"与 NSSortDescriptor 一起使用以按对象本身而不是对象的属性进行排序吗? (核心数据/NSFetchedResultsController),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31929592/