func removeFilterPredicate (_ предикат: MPMediaPredicate) не работает согласованно - PullRequest
0 голосов
/ 26 сентября 2019

Я испытываю противоречивую проблему при попытке func removeFilterPredicate(_ predicate: MPMediaPredicate), однако у меня никогда не возникает проблема при попытке func addFilterPredicate(_ predicate: MPMediaPredicate)

Когда я тестирую свое приложение и добавляю предикат, он работает каждый разбезошибочно.Когда я пытаюсь удалить предикат, обычно это работает, но иногда нет.

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

Что на самом деле иногда происходит после того, как я удалю предикат и перейду к следующемуеще больше песен из предыдущего предиката все еще воспроизводятся

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

Способ добавления предиката:

func getSongsWithCurrentArtistFor(item: MPMediaItem) -> MPMediaQuery {
  let artistPredicate = MPMediaPropertyPredicate(value: item.artist, forProperty: MPMediaItemPropertyArtist, comparisonType: .contains)
  let query = MPMediaQuery()
  query.addFilterPredicate(artistPredicate)
  return query
}


let lockArtist = MediaManager.shared.getSongsWithCurrentArtistFor(item: nowPlaying)
  if var items = lockArtist.items {
    items.shuffle()
    let descriptor = MPMusicPlayerMediaItemQueueDescriptor(itemCollection: MPMediaItemCollection(items: items))
    self.mediaPlayer.prepend(descriptor)
   }

, который снова НИКОГДА не дает сбой

Чтобы удалить предикат:

func removeArtistLockFor(item: MPMediaItem) -> MPMediaQuery {
  let artistPredicate = MPMediaPropertyPredicate(value: item.artist, forProperty: MPMediaItemPropertyArtist)
  let query = MPMediaQuery()
  query.removeFilterPredicate(artistPredicate)
  return query
}

let unlockArtist = MediaManager.shared.removeArtistLockFor(item: nowPlaying)
  if var items = unlockArtist.items?.filter({ (item) -> Bool in
    return item.mediaType.rawValue <= MPMediaType.anyAudio.rawValue
      }) {
      items.shuffle()
       let descriptor = MPMusicPlayerMediaItemQueueDescriptor(itemCollection: MPMediaItemCollection(items: self.newSongs.shuffled()))
       self.mediaPlayer.prepend(descriptor)
 }

Мне интересно, еслиA) Существует проблема с тем, как я удаляю MPMediaPropertyPredicate, B) Мне нужен какой-то дополнительный метод для исправления крайнего случая быстро меняющейся песни, или C) оба.

Я знаю, что у меня естьранее писал о проблемах с MPMediaPlayer .. в частности о func prepend(_ descriptor: MPMusicPlayerQueueDescriptor), но эти проблемы были решены в ios13.Это новая проблема ... и тот факт, что добавление предиката ВСЕГДА работает, заставляет меня думать, что это скорее ошибка с моей стороны, а не проблема Apple ...?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...