尝试 当我测试我的应用并添加谓词时,它每次都会正常运行。当我尝试删除谓词时,通常它起作用,但有时却不起作用。 我期望的行为是先删除谓词,然后再删除与先前谓词不匹配的随机歌曲 实际上有时发生的事是在删除谓词并跳到下一首歌曲之后,还有更多来自先前谓词的歌曲仍在播放 我发现,如果我想保证它不会失败,可以通过添加谓词以仅播放特定歌手的歌曲,然后快速跳过几首歌曲,然后尝试删除谓词来做到这一点。 我添加谓词的方式是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) }
[我想知道A)删除
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) }
的方式是否有问题,B)我需要某种添加的方法来解决歌曲快速变化的情况,或者C)两者都有。
[我知道我以前发布过有关MPMediaPlayer的问题的信息,特别是有关MPMediaPropertyPredicate
的信息,但这些问题已在ios13中解决。这是一个新问题...而且添加谓词始终有效的事实使我认为这更多的是我自己的错误,而不是苹果的问题...?
<< removeArtistLockFor
let query = MPMediaQuery()
query.removeFilterPredicate(artistPredicate)