我有一个充满来自第三方的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]];
Run Code Online (Sandbox Code Playgroud)
但我得到的结果如下.这些仍然按字母顺序排序为字符串.
730275292
73900038
730172867
7350727
830138437
835164
837287901
8338804
930274
9324376
Run Code Online (Sandbox Code Playgroud)
我对使用这个比较器块有什么不了解?
编辑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]];
Run Code Online (Sandbox Code Playgroud)
我仍然按字母顺序排序结果!所以这让我觉得比较器块甚至没有被使用.
716164250
726354466
73900038
739600038
7450727
810138437
801164
801375346
8213997
Run Code Online (Sandbox Code Playgroud)
Max*_*Max 11
Try this !
[NSSortDescriptor sortDescriptorWithKey:@"name"
ascending:YES
selector:@selector(localizedStandardCompare:)]
Run Code Online (Sandbox Code Playgroud)
我不使用 NSFetchRequest 所以我不能具体评论,但它似乎与它相关。您在比较器块中使用的代码就很好。我设置了一个由您显示的确切数字组成的数组,然后使用您的代码对它们进行排序,一切顺利:
\n\n NSArray *array = [NSArray arrayWithObjects:@"730275292",\n @"73900038",\n @"730172867",\n @"7350727",\n @"830138437",\n @"835164",\n @"837287901",\n @"8338804",\n @"930274",\n @"9324376", nil];\n NSNumberFormatter *numFormatter = [[NSNumberFormatter alloc] init];\n [numFormatter setNumberStyle:NSNumberFormatterDecimalStyle];\n NSArray *sArray = [array sortedArrayUsingComparator:^(id a, id b) {\n return [[numFormatter numberFromString:a] compare:[numFormatter numberFromString:b]];\n }];\n NSLog(@"%@",sArray);\nRun Code Online (Sandbox Code Playgroud)\n\n当上面的代码运行时,我得到一个日志:
\n\n(\n 835164,\n 930274,\n 7350727,\n 8338804,\n 9324376,\n 73900038,\n 730172867,\n 730275292,\n 830138437,\n 837287901\n)\nRun Code Online (Sandbox Code Playgroud)\n\n我相信这就是您正在寻找的订单。您可能会考虑获取提取请求的结果,并在收到它们后将它们排序在数组中。我怀疑数组进行排序还是获取请求进行排序是否重要。使用其中一种很可能不会比另一种获得任何性能提升。
\n\n如果您仍然希望 NSFetchRequest 进行排序,那么为了让它正确排序,您可能缺少一些东西。老实说,我不确定,因为我没有使用过它。
\n\n更新
\n\n快速浏览 NSFetchRequest 文档,我发现有一些参数会影响排序。例如,在它的文档中resultType给出了以下消息:
\n\n\n您可以使用 setResultType: 设置执行请求时返回的对象的实例类型\n\xe2\x80\x94有关可能的值,请参阅\n \xe2\x80\x9cNSFetchRequestResultType。\xe2\x80\x9d 如果将该值设置为\ NSManagedObjectIDResultType,如果您不在请求中包含属性值,这会将任何排序顺序降级为 \n \xe2\x80\x9cbest尽力\xe2\x80\x9d 提示。
\n
所以看起来返回类型可能会影响您的排序。
\n| 归档时间: |
|
| 查看次数: |
4582 次 |
| 最近记录: |