Как правильно добавить предикат для музыкальных сборников в MPMediaItem - PullRequest
4 голосов
/ 25 октября 2019

В моем приложении я проверяю, входит ли текущая песня в альбом. Я могу это сделать, но обнаружил, что если альбом является частью компиляции, мой код не работает должным образом.

Что я хочу сделать, так это то, что текущая воспроизводимая песня является частью альбома. Кнопка становится активной, и если она не включена, кнопка не активируется. В моем iTunes есть аблум, где все песни имеют одно и то же название альбома, но в приложении кнопка не активируется, но iTunes пометил альбом как сборник.

Код, который я использую для запроса:

let albumPredicate = MPMediaPropertyPredicate(value: item.albumTitle, forProperty: MPMediaItemPropertyAlbumTitle)

Я пытался

let compilationPredicate = MPMediaPropertyPredicate(value: item.isCompilation, forProperty: MPMediaItemPropertyIsCompilation)

и позже

, если item.isCompilation == true, чтобы определить,Я бы добавил этот предикат в набор фильтров.

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

func getSongsWithCurrentAlbumFor(item: MPMediaItem) -> MPMediaQuery {

  let artistPredicateWithin = MPMediaPropertyPredicate(value: item.artist, forProperty: MPMediaItemPropertyArtist, comparisonType: .contains)
  let albumPredicate = MPMediaPropertyPredicate(value: item.albumTitle, forProperty: MPMediaItemPropertyAlbumTitle)

  let compilationPredicate = MPMediaPropertyPredicate(value: item.isCompilation, forProperty: MPMediaItemPropertyIsCompilation)

  var isComp: String
  var myFilterSet: Set<MPMediaPropertyPredicate>!

  if item.isCompilation == true {
    myFilterSet = [artistPredicateWithin, albumPredicate, compilationPredicate]
    isComp = "true"
  } else {
    myFilterSet = [artistPredicateWithin, albumPredicate]
    isComp = "false"
  }

  print(isComp)

  var query = MPMediaQuery(filterPredicates: nil)
  query = MPMediaQuery(filterPredicates: myFilterSet)
  query.addFilterPredicate(albumPredicate)
  albumQuery = query
  return albumQuery
}

Что я сделал не так в своем коде?

1 Ответ

0 голосов
/ 05 ноября 2019

В документации для свойства MPMediaItemPropertyIsCompilation указано, что оно должно быть заключено в значение NSNumber.

...