NSSortDescriptor initWithKey:升序:比较器:无法使用localizedCaseInsensitiveCompare

时间:2011-11-25 20:48:46

标签: cocoa core-data

在核心数据获取请求中,我想对结果不区分大小写进行排序。 所以我编码:

NSSortDescriptor *sortDescriptor = 
     [[NSSortDescriptor alloc] initWithKey:@"name" 
                                 ascending:YES 
                                comparator:^(id s1, id s2) 
            {

                return [s1 localizedCaseInsensitiveCompare:s2];
            }];

但不幸的是结果仍然是:  B U a c y z。

但Block看起来没问题,因为如果我用该代码对结果进行排序:

NSMutableArray* names = ......
[names sortUsingComparator:^(id s1, id s2) 
     {

         return [s1 localizedCaseInsensitiveCompare:s2];
     }]; 

结果是:   a B c U y z。

我的错在哪里?

2 个答案:

答案 0 :(得分:3)

我找到了一个不使用Block的解决方案 - 但是使用了选择器:

NSSortDescriptor *sortDescriptor =
       [[NSSortDescriptor alloc] initWithKey:@"question" 
                                    ascending:YES 
                                    selector:@selector(localizedCaseInsensitiveCompare:)];

如果“name”是核心数据实体的字符串属性,则它运行良好。

答案 1 :(得分:0)

如果您的结果集很大并且您正在通过它进行分页(比如使用NSFetchedResultsControllerNSFetchRequest的{​​{1}}和fetchLimit),那么您不需要使用fetchOffset的{​​{1}}因为CoreData将获取所有对象并将其排序到数据库之外。

相反,请存储要对其进行排序的属性的小写副本,例如NSSortDescriptor,然后使用initWithKey:ascending:selector:的{​​{1}}搜索该属性。