2012-01-26 104 views
0

我試圖以與iTunes類似的方式從「Tracks」的CoreData「表」中排序結果。問題是,「ASC」排序使用的第一個字符來排序,所以我結束了:按字母數字排序的NSSortDescriptor

  1. (我看沒)滿意度
  2. 艱苦的日子夜

我希望The Stones在「I」結果中出現,基本上忽略任何^ A-Za-z0-9。我試過一個自定義選擇器和比較器塊,但它只是忽略它,所以我卡住了。

回答

2

根據我的經驗,最好在對象創建時生成sortName屬性。然後,您可以使用該鍵以更簡單快捷的方式對CoreData結果進行排序。

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]作爲模式很好,但好像有一個巨大的性能損失。