ios - 可以将 "self"与 NSSortDescriptor 一起使用以按对象本身而不是对象的属性进行排序吗? (核心数据/NSFetchedResultsController)

标签 ios objective-c sorting nsfetchedresultscontroller nssortdescriptor

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;

最佳答案

您可以使用 NSSortDescriptorself 键,它可以正常工作。

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

核心数据更新:

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

对于 Core Data,NSSortDescriptor 键路径必须是自定义 NSManagedObject 类的 Core Data 属性/关系。

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

关于ios - 可以将 "self"与 NSSortDescriptor 一起使用以按对象本身而不是对象的属性进行排序吗? (核心数据/NSFetchedResultsController),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31929592/

相关文章:

javascript - 如何按对象的值对对象数组进行排序

ios - 快速持续声明

ios - 无法用字典中的数字替换对象

c# - List.Sort 方法的二次排序

ios - AVAssetResourceLoader 支持的 AVURLAsset 播放仅通过 AirPlay 失败

ios - 在自动布局中将 subview 的 X 居中抛出 "not prepared for the constraint"

php - 如何在每次迭代中以从上到下的方式旋转数组元素

android - 使用 React Native 更改键盘后面的背景颜色?

ios - CoreBluetooth 有时无法检测到 CBPeripheral,除非访问控制中心/通知中心

ios - iOS 7 中 UITableView 的 contentInset 规则?