我最近在尝试对一组对象进行排序时遇到了一些问题。
我想要排序的对象是NSManagedObject的子类
我想通过'global_index'对对象进行排序,但不是我的模型中的属性。它只是每个对象实现的getter -(NSInteger)globalIndex {...}
。在这个方法中,我做了一些复杂的计算,这是用简单的排序描述符完成的。
现在,我的问题是:有没有办法让NSSortDescriptor 按方法的返回值对对象进行排序?
我真的想使用排序描述符,因为它是(IMO)使用NSFetchedResultsController的很酷功能的唯一方法。或者有没有办法告诉控制器如何对获取的对象进行排序?像...
- (NSArray *)sortObjects:(NSSet *)objects {...}
提前致谢!
答案 0 :(得分:2)
根据Core Data Programming Guide,
另一方面,SQL存储将谓词和排序描述符编译为SQL,并在数据库本身中评估结果。这主要是为了提高性能,但这意味着评估是在非Cocoa环境中进行的,因此依赖Cocoa的排序描述符(或谓词)无法工作。支持的排序选择器是compare:和caseInsensitiveCompare:,localizedCompare:,localizedCaseInsensitiveCompare:和localizedStandardCompare :(后者是类似Finder的排序,以及大多数人应该在大多数时间使用的东西)。此外,您无法使用SQLite存储对瞬态属性进行排序。
简单的解决方法是使用每个对象保存订单(当您需要在另外两个对象之间插入对象时会很痛苦,但这是尝试在数据库中实现有效的有序集合时的问题)。
答案 1 :(得分:1)
您是否尝试过将@"globalIndex"
作为排序描述符的密钥?这应该可以正常工作,因为有一个密钥访问器。
答案 2 :(得分:0)
你应该能够'欺骗'NSSortDescriptor使用你的全局索引方法,就像任何常规访问器方法一样(访问器应该符合Key-Value Programming的期望)。换句话说,将 globalIndex 视为NSManagedObject子类的属性,并在每个子类中使用以下方法。
-(NSInteger) globalIndex {
...
}
-(void) setGlobalIndex: (NSInteger) idx {
...
}
为了使事情变得更容易,您可以使用额外的方法定义NSManagedObject的子类,并从中扩展子类(或者以任何方式创建Category)。应该工作得很好。