Запрашивать две и более песни одновременно, используя функцию «addFilterPredicate» по MPMediaItemPropertyPersistentID

#iphone #cocoa-touch #mpmediaquery

#iPhone #cocoa-touch #mpmediaquery

Вопрос:

Мое приложение автоматически загружает список воспроизведения музыки при запуске. Чтобы сделать это, я сохраняю идентификаторы песен MPMediaItemPropertyPersistentID в базе данных и загружаю песни при следующем запуске приложения. Основной код следующий:

 MPMediaQuery *MPMediaSongQuery = [MPMediaQuery songsQuery];

MPMediaPropertyPredicate *iPodMusicSongPredicateiPodMusicSongPredicate = [MPMediaPropertyPredicate 
                                  predicateWithValue:[NSNumber numberWithUnsignedLongLong: songID] 
                                  forProperty:MPMediaItemPropertyPersistentID     
                                  comparisonType:MPMediaPredicateComparisonEqualTo];

[MPMediaSongQuery addFilterPredicate:iPodMusicSongPredicate];
NSArray *collections = MPMediaSongQuery.collections;
  

Код загружает песни одну за другой. Мой вопрос: есть ли какой-либо способ запросить две или более песен с помощью MPMediaItemPropertyPersistentID одновременно при использовании функции addFilterPredicate: ? Спасибо.

Ответ №1:

Если вы используете более одного addFilterPredicate, они объединяются с логическим И. Таким образом, вы можете только уменьшить результаты первого запроса, но не расширять его. Как следствие, вам не разрешается использовать несколько addFilterPredicates для одного и того же свойства. На самом деле результат не определен и, скорее всего, окажется в пустой коллекции. То, что вы ищете, представляет собой комбинацию одного и того же свойства с логическим ИЛИ. Вы можете добиться этого, как показано в следующем псевдокоде:

 MPMediaQuery *MPMediaSongQuery = [MPMediaQuery songsQuery];

NSMutableArray *collections = [[NSMutableArray alloc] initWithCapacity:1];

for (int i=0; i < songIDCount; i  ) {

   MPMediaPropertyPredicate *iPodMusicSongPredicateiPodMusicSongPredicate = [MPMediaPropertyPredicate 
                                  predicateWithValue:[NSNumber numberWithUnsignedLongLong: songID[i]] 
                                  forProperty:MPMediaItemPropertyPersistentID     
                                  comparisonType:MPMediaPredicateComparisonEqualTo];

   [MPMediaSongQuery addFilterPredicate:iPodMusicSongPredicate];

   [collections addObjectsFromArray:MPMediaSongQuery.collections];

   [MPMediaSongQuery removeFilterPredicate:iPodMusicSongPredicate];

}
  

Комментарии:

1. Суть в том, чтобы сделать только один запрос к музыкальной библиотеке. Ваш код по-прежнему запрашивает i раз…