可以将“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)的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Numpy Eig 与 Python Lambda 函数一起使用?