func removeFilterPredicate(_ predicate: MPMediaPredicate) 不能



我在尝试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中得到解决。这是一个新问题...添加谓词始终有效的事实让我认为这更像是我的错误,而不是苹果的问题......?

removeArtistLockFor函数中的行

let query = MPMediaQuery()
query.removeFilterPredicate(artistPredicate)

。似乎正在创建 MPMediaQuery 的新实例,因此除非它的行为类似于单例(从文档中似乎并非如此(,否则此时将没有什么可删除的。

是否应该在添加谓词并将其传递给 remove 函数时保留对查询的引用,以便您可以执行

passedQuery.removeFilterPredicate(artistPredicate)

相关内容

  • 没有找到相关文章

最新更新