NSSortDescriptor将字符串字段排序为数字,比较器块不起作用

时间:2012-04-30 21:34:28

标签: ios core-data

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

我想在整数值上对这个id排序的提取进行排序。所以我将NSSortDescriptor添加到NSFetchRequest

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

2 个答案:

答案 0 :(得分:11)

试试这个!

[NSSortDescriptor sortDescriptorWithKey:@"name"
ascending:YES
selector:@selector(localizedStandardCompare:)]

答案 1 :(得分: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,这会将任何排序顺序降级为   如果你不包括属性值,“尽力而为”提示   请求。

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