我有一个具有两个属性的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。