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