2012-04-24 2 views
2

я следующее:Поиск нескольких типов с MPMediaPropertyPredicate

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

NSSet *predicateSet = [NSSet setWithObject:titlePredicate]; 
MPMediaQuery *searchQuery = [[MPMediaQuery alloc] initWithFilterPredicates:predicateSet]; 
NSArray *itemsFromTextQuery = [searchQuery items]; 

for (MPMediaItem *song in itemsFromTextQuery) 
{ 
    [arrayOfSongItems addObject:song]; 
} 

который прекрасно работает, но только искал название трека. Мне бы хотелось, чтобы он возвращал результаты для названия, исполнителя и имени альбома.

ответ

4

Try следующий код

MPMediaQuery* query = [MPMediaQuery albumsQuery]; 

[query addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:self.strArtist forProperty:MPMediaItemPropertyArtist]] 

[query addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:self.strTitle forProperty:MPMediaItemPropertyAlbumTitle]]; 
+0

Это предполагает, что две строки разные. Я хочу показать, например, таблицу поиска iPhone для iPod, исполнителя или альбома или найденного трека. – daidai

4

это работает для меня:

MPMediaQuery *searchQuery = [[MPMediaQuery alloc] init]; 
NSPredicate *test = [NSPredicate predicateWithFormat:@"title contains[cd] %@ OR albumTitle contains[cd] %@ OR artist contains[cd] %@", searchString, searchString, searchString]; 
NSArray *filteredArray = [[searchQuery items] filteredArrayUsingPredicate:test]; 

//NSLog(@"%@", [filteredArray valueForKeyPath:@"title"]); 

for (MPMediaItem *song in filteredArray) 
{ 
    [arrayOfSongItems addObject:song]; 
} 

Я в основном фильтр после получать все элементы из запроса средств массовой информации. Я не думаю, что мое решение лучше, чем фильтрация запроса в первую очередь, но определенно лучше, чем поиск по три раза по отдельности. Или итерации через массив несколько раз.

+0

Это все хорошо - но тогда как вы узнаете, есть ли его трек, альбом или исполнитель? – daidai

+0

, если вам нужна эта информация, тогда в чем проблема, если не использовать 3 запроса? Вы можете использовать мое решение, а затем в цикле for проверить эти три значения: if ([song.title isEqualToString: searchString]) {} 'и т. Д. ИЛИ если вы используете 3 запроса и хотите их объединить, вы можете проверить их перед добавлением новый элемент в ваш массив с 'if ([arr indexOfObject: @" new Item "] == NSNotFound) {// добавить новый элемент}' –

+0

проблема в производительности. запуск 3 запросов по всей библиотеке может занять несколько секунд - где музыкальный проигрыватель Apple делает это очень быстро. – daidai

Смежные вопросы