我有一个具有两个属性的CoreData实体。一个叫做“position”,另一个叫做“positionChange”。它们都是整数,其中position属性是当前位置,而positionChange是前一个位置和新位置之间的差。这意味着positionChange可以为负数。

现在,我想按positionChange排序。但是我希望它忽略负面的值(value)观。目前,我正在对其进行降序排序,这将得出结果: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:'

有什么可能的想法吗?我已经在我的DataManager类中包含了我的NSNumber类别头文件。

最佳答案

假设您的positionChange是一个NSNumber,请尝试以下操作:

@interface NSNumber (AbsoluteValueSort)

-(NSComparisonResult) comparePositionChange:(NSNumber *)otherNumber;

@end

其次是:
@implementation NSNumber (AbsoluteValueSort)

-(NSComparisonResult) comparePositionChange:(NSNumber *)otherNumber
{
    return [[NSNumber numberWithFloat: fabs([self floatValue])] compare:[NSNumber numberWithFloat: fabs([otherNumber floatValue])]];
}

@end

然后执行以下操作:
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"positionChange" ascending:NO selector:@selector(comparePositionChange:)];

并使用该描述符进行排序。如果要使-2始终在2之后,或者5始终在-5之后,则可以修改comparePositionChange:在一个数字为另一个数字为负数的情况下返回NSOrderedAscending。

10-08 17:15