1

我正在使用MPMediaQuery搜索用户库中的歌曲标题:

MPMediaPropertyPredicate *titlePredicate = [MPMediaPropertyPredicate predicateWithValue:titleString
                                                                            forProperty:MPMediaItemPropertyTitle
                                                                         comparisonType:MPMediaPredicateComparisonContains];

MPMediaQuery *query = [[MPMediaQuery alloc] init];
[query addFilterPredicate: titlePredicate];


NSArray* result = query.items;

titleString是用户输入的NSString,取自UISearchField。这在大多数情况下都可以正常工作,但在某些情况下会失败:当您在桌面上使用 iTunes 时,您可以搜索“holle”,它会找到“Der Hölle Rache”。这不适用于我的方法。同样,搜索“que”不会找到“Qué pasa?”。有没有办法来解决这个问题?

4

1 回答 1

0

MPMediaPropertyPredicate当前不允许您指定任何NSStringCompareOptions. 这种情况需要一个变音符号不敏感搜索,它会忽略任何重音符号或其他变音符号。

一种解决方法(尽管根据库大小比理想的要慢)是使用变音符号和不区分大小写的搜索遍历整个媒体库,NSString rangeOfString:options:方法是:

MPMediaQuery *query = [[MPMediaQuery alloc] init];
NSArray *result = query.items;
NSString *searchString = @"que";

NSIndexSet *filteredSet = [result indexesOfObjectsWithOptions:NSEnumerationConcurrent
                                                  passingTest:^BOOL(MPMediaItem *song, NSUInteger idx, BOOL *stop) {
    NSString *songTitle = [song valueForProperty:MPMediaItemPropertyTitle];
    NSRange foundRange = [songTitle rangeOfString:searchString
                                          options:NSDiacriticInsensitiveSearch | NSCaseInsensitiveSearch];

    // rangeOfString:options: returns {NSNotFound, 0} if "que" is not found during search.
    if (foundRange.location != NSNotFound) { 
        return YES;
    } else
        return NO; 
}];

NSArray *filteredResult = [result objectsAtIndexes:filteredSet];
于 2012-11-16T02:43:27.357 回答