iphone - 使用 iPhone 的排序描述符对核心数据位置变化进行排序

标签 iphone objective-c sorting core-data nssortdescriptor

我有一个具有两个属性的 CoreData 实体。一个称为“position”,另一个称为“positionChange”。它们都是整数,其中 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 类中。

最佳答案

代码因 unsupported NSSortDescriptor selector 错误而失败的原因是您正在使用 SQLite 数据存储并尝试使用 Cocoa 方法作为排序描述符。使用 SQLite 存储,排序描述符被即时翻译成 SQL,排序由 SQLite 完成。这确实有助于提高性能,但也意味着排序是在不存在自定义比较方法的非 Cocoa 环境中完成的。这样的排序仅适用于常见的已知方法,不适用于任意 Cocoa 代码。

一个简单的解决方法是在不排序的情况下进行提取,获取结果数组,然后对其进行排序。可以使用您想要的任何 Cocoa 方法对数组进行排序,因此 med200 的类别应该在那里很有用。

如果您的数据集不是很大,您也可以从 SQLite 数据存储更改为二进制存储。

关于iphone - 使用 iPhone 的排序描述符对核心数据位置变化进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6535164/

相关文章:

ios - 让 Google Maker 像一个切换按钮

c++ QuickSort不清楚

Scala:A 扩展 Ordered[A]

iphone - dismissModalViewController 将父 View 隐藏在状态栏后面

javascript - 在移动浏览器中调试?

iphone - 从 NSMutableArray 中的元素中删除字符?

iphone - cocoa 和 cocoa 触感的区别

objective-c - 如何在应用程序中的任何地方设置导航栏的图像

objective-c - TripIt 长久以来的代币

Python排序包含元组列表的类实例