Я испытываю противоречивую проблему при попытке 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 ...?