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

Posted

技术标签:

【中文标题】可以将“self”与 NSSortDescriptor 一起使用来按对象本身而不是对象的属性进行排序? (核心数据/NSFetchedResultsController)【英文标题】:Possible to use "self" with NSSortDescriptor to sort by the object itself, rather than object's property? (Core Data / NSFetchedResultsController) 【发布时间】:2015-08-10 21:35:48 【问题描述】:

NSSortDescriptor 有方法sortDescriptorWithKey:ascending:selector:

这需要被排序的对象,找到对象的 key 的键值编码属性,然后将该属性发送到指定的选择器。

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

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

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

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

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

(顺便说一句,由于Core Data,我不能使用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;

【问题讨论】:

您是什么意思“通过其中一种方法对对象进行排序”?这种方法的形式是什么?它是否需要另一个对象,它会返回什么?是否命名为compare:?如果没有,您是否尝试过将其选择器传递给排序描述符构造函数?当您说@"self" 不起作用时,您是什么意思?究竟会发生什么,它与您想要的有什么不同? @KenThomases 该方法将匹配NSSortDescriptor 文档中的描述(必须与compare: 基本匹配)。但是我遇到的问题是我将选择器发送到的对象,而不是选择器本身。想发给object,只能发给object.property 当您指定@"self"@selector(yourComparisonMethod:) 时,您还没有说出究竟是什么失败了。它通常与排序描述符一起使用。 Core Data 可能存在问题,但除非您解释发生了什么,否则无法弄清楚。 @KenThomases 已添加,谢谢。 【参考方案1】:

NSSortDescriptor可以配合self键使用,正常使用。

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

核心数据更新:

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

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

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

【讨论】:

但这怎么可能? Apple's own documentation for this method 表示参数的类型必须是NSString 但是你把它作为NSString参数发送,它却叫self [self.objects sortUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES]]]; 此代码与objects 数组正常工作,这是NSDate 对象数组 @SevenBits with Key-Value,一个属性表示为一个字符串developer.apple.com/library/ios/documentation/Cocoa/Conceptual/… @VitaliyGozhenko 与 Core Data 配对时,也许一切都更加麻烦。当我通过@"self" 我得到:'NSInvalidArgumentException', reason: 'keypath #self not found in entity <NSSQLEntity MYClass>

以上是关于可以将“self”与 NSSortDescriptor 一起使用来按对象本身而不是对象的属性进行排序? (核心数据/NSFetchedResultsController)的主要内容,如果未能解决你的问题,请参考以下文章

基于数组更新 UITableView

将 self 与实例一起用于分配和释放 [重复]

将 dispatch_async 与 self 一起使用

如何将 Numpy Eig 与 Python Lambda 函数一起使用?

将 mypy 的通用 self 与 python2 类型注释一起使用

python编程之self._name与self.name的区别