【发布时间】:2011-09-25 23:35:44
【问题描述】:
我有一个具有两个属性的 CoreData 实体。一个称为“位置”,另一个称为“位置变化”。它们都是整数,其中 position 属性是当前位置,而 positionChange 是前一个位置和新位置之间的差异。这意味着 positionChange 可以为负数。
现在我想按 positionChange 排序。但我希望它忽略负值。目前我正在对其进行降序排序,这将给出结果:2、1、0、-1、-2。 但我正在寻找的是得到这个结果:2、-2、1、-1、0。
关于如何使用排序描述符解决此问题的任何想法?
编辑
我有 2 个类,一个称为 DataManager,另一个包含我的 NSNumber 类别(positionChange 是 NSNumber 类型)。
在 DataManager 中,我有一个名为 'fetchData:' 的方法,我在其中使用排序描述符执行获取请求:
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity" inManagedObjectContext:managedObjectContext];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"positionChange" ascending:NO selector:@selector(comparePositionChange:)];
[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
我正在对请求做更多的事情,但这对这个问题没有意义。
我的 NSNumber 类别应该与您发布的类别完全相同: 在 .h 中:
@interface NSNumber (AbsoluteValueSort)
- (NSComparisonResult)comparePositionChange:(NSNumber *)otherNumber;
@end
在 .m 中:
@implementation NSNumber (AbsoluteValueSort)
- (NSComparisonResult)comparePositionChange:(NSNumber *)otherNumber
{
return [[NSNumber numberWithFloat:fabs([self floatValue])] compare:[NSNumber numberWithFloat:fabs([otherNumber floatValue])]];
}
@end
当我在我的 DataManager 对象上调用 fetchData 时,我得到了这个错误:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'unsupported NSSortDescriptor selector: comparePositionChange:'
对可能的情况有什么想法吗?我已将我的 NSNumber 类别头文件包含在我的 DataManager 类中。
【问题讨论】:
-
你能在模型中添加一个
absolutePositionChange字段并用abs(positionChange)填充它(在positionChange的设置器中,如果有的话)?您可以在排序描述符中使用该字段。
标签: iphone objective-c sorting core-data nssortdescriptor