我有一个充满来自第三方的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
答案 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,这会将任何排序顺序降级为 如果你不包括属性值,“尽力而为”提示 请求。
因此看起来返回类型可能会影响您的排序。