NSSortDescriptor按字母数字排序

时间:2012-01-26 22:03:08

标签: iphone objective-c

我正试图以与iTunes类似的方式对“Tracks”的CoreData“表”中的结果进行排序。问题是,“ASC”排序使用第一个字符进行排序,所以我最终得到:

  
      
  1. (我不能得不到)满意
  2.   
  3. 艰难的一天之夜
  4.   

我希望The Stones以“I”出现在结果中,基本上忽略了任何东西^ A-Za-z0-9。我已经尝试了一个自定义选择器和比较器块,但它只是忽略它,所以我卡住了。

2 个答案:

答案 0 :(得分:2)

根据我的经验,您最好拥有在对象创建时生成的sortName属性。然后,您可以使用该键以更简单,更快速的方式对CoreData结果进行排序。

答案 1 :(得分:1)

另一种解决方案是在获取结果后手动排序:

[tracks sortUsingComparator:^NSComparisonResult(id obj1, id obj2)
{
    NSError *error = nil;
    NSString *pattern = @"[^A-Za-z0-9]";
    NSRegularExpression *expr = [NSRegularExpression regularExpressionWithPattern:pattern
                                                                          options:NSRegularExpressionCaseInsensitive
                                                                            error:&error];

    NSString *title1 = [(Track *)obj1 title];
    NSString *title2 = [(Track *)obj2 title];

    NSString *title1Match = [expr stringByReplacingMatchesInString:title1
                                                           options:0
                                                             range:NSMakeRange(0, [title1 length])
                                                      withTemplate:@""];
    NSString *title2Match = [expr stringByReplacingMatchesInString:title2
                                                           options:0
                                                             range:NSMakeRange(0, [title2 length])
                                                      withTemplate:@""];

    return [title1Match compare:title2Match options:NSCaseInsensitiveSearch];
}];

我也尝试[\ W]作为模式,但似乎有很大的性能影响。