我試圖以與iTunes類似的方式從「Tracks」的CoreData「表」中排序結果。問題是,「ASC」排序使用的第一個字符來排序,所以我結束了:按字母數字排序的NSSortDescriptor
- (我看沒)滿意度
- 艱苦的日子夜
我希望The Stones在「I」結果中出現,基本上忽略任何^ A-Za-z0-9。我試過一個自定義選擇器和比較器塊,但它只是忽略它,所以我卡住了。
我試圖以與iTunes類似的方式從「Tracks」的CoreData「表」中排序結果。問題是,「ASC」排序使用的第一個字符來排序,所以我結束了:按字母數字排序的NSSortDescriptor
- (我看沒)滿意度
- 艱苦的日子夜
我希望The Stones在「I」結果中出現,基本上忽略任何^ A-Za-z0-9。我試過一個自定義選擇器和比較器塊,但它只是忽略它,所以我卡住了。
根據我的經驗,最好在對象創建時生成sortName
屬性。然後,您可以使用該鍵以更簡單快捷的方式對CoreData結果進行排序。
另一種解決方案是在獲取結果後,手動排序:
[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]作爲模式很好,但好像有一個巨大的性能損失。