5

我有一个充满第三方 id 的字段。id 是数字,但作为字符串写入数据库。

我想对按此 id 排序的整数值进行排序。所以我将这个添加NSSortDescriptorNSFetchRequest.

NSNumberFormatter *numFormatter = [[NSNumberFormatter alloc] init];
[numFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
NSSortDescriptor *sortBy = [[NSSortDescriptor alloc] initWithKey:@"someId" ascending:YES comparator:^(id a, id b) {
    return [[numFormatter numberFromString:a] compare:[numFormatter numberFromString:b]];
}];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortBy]];

但我得到如下结果。这些仍然按字母顺序排序为字符串。

730275292
73900038
730172867
7350727
830138437
835164
837287901
8338804
930274
9324376

我对使用这个比较器块有什么不明白的地方?

编辑 2012 年 5 月 1 日美国东部标准时间上午 9:20

为了测试是否正在使用比较器块,我尝试了以下根据字段长度进行排序。

NSSortDescriptor *sortBy = [[NSSortDescriptor alloc] initWithKey:@"fbId" ascending:YES comparator:^(id a, id b) {
    if ([a length] < [b length]) {
        return NSOrderedAscending;
    } else if ([a length] > [b length]) {
        return NSOrderedDescending;
    } else {
        return NSOrderedSame;
    }
}];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortBy]];

我仍然得到按字母顺序排序的结果!所以这让我觉得比较器块甚至没有被使用。

716164250
726354466
73900038
739600038
7450727
810138437
801164
801375346
8213997
4

2 回答 2

13

尝试这个 !

[NSSortDescriptor sortDescriptorWithKey:@"name"
ascending:YES
selector:@selector(localizedStandardCompare:)]
于 2013-06-16T00:30:53.003 回答
1

我不使用 NSFetchRequest 所以我不能具体评论它,但它似乎与它相关。您在比较器块中使用的代码很好。我设置了您显示的确切数字的数组,然后使用您的代码对它们进行排序,一切正常:

    NSArray *array = [NSArray arrayWithObjects:@"730275292",
                      @"73900038",
                      @"730172867",
                      @"7350727",
                      @"830138437",
                      @"835164",
                      @"837287901",
                      @"8338804",
                      @"930274",
                      @"9324376", nil];
    NSNumberFormatter *numFormatter = [[NSNumberFormatter alloc] init];
    [numFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
    NSArray *sArray = [array sortedArrayUsingComparator:^(id a, id b) {
        return [[numFormatter numberFromString:a] compare:[numFormatter numberFromString:b]];
    }];
    NSLog(@"%@",sArray);

当上面的代码运行时,我得到一个日志:

(
    835164,
    930274,
    7350727,
    8338804,
    9324376,
    73900038,
    730172867,
    730275292,
    830138437,
    837287901
)

我相信这是您正在寻找的订单。您可能会考虑在收到获取请求的结果后将它们排序到一个数组中。我怀疑数组是否进行排序或获取请求是否进行排序是否重要。很可能使用其中一种并没有性能提升。

如果您仍然希望 NSFetchRequest 进行排序,那么您可能会缺少一些东西以使其正确排序。老实说,我不确定,因为我没有使用过它。

更新

快速浏览 NSFetchRequest 文档,我发现有一些参数会影响排序。例如,在它的文档中resultType它给出了这个消息:

您可以使用 setResultType: 设置执行请求返回的对象的实例类型——有关可能的值,请参阅“NSFetchRequestResultType”。如果您将该值设置为 NSManagedObjectIDResultType,如果您未在请求中包含属性值,这会将任何排序顺序降级为“尽力而为”提示。

所以看起来返回类型可能会影响您的排序。

于 2012-05-01T13:50:21.697 回答