Ios 按检索+上次播放的顺序显示和播放MPMediaItem歌曲

Ios 按检索+上次播放的顺序显示和播放MPMediaItem歌曲,ios,swift,uitableview,mpmusicplayercontroller,Ios,Swift,Uitableview,Mpmusicplayercontroller,我正在开发一个应用程序,它利用MPMusicLayerApplicationController播放用户本地音乐库中的音乐 从库中检索的歌曲如下所示: func retrieveMusic() { mediaQueryQueue.async { let songsQuery = MPMediaQuery.songs() let songsCollections = songsQuery.collections for songCollect

我正在开发一个应用程序,它利用MPMusicLayerApplicationController播放用户本地音乐库中的音乐

从库中检索的歌曲如下所示:

func retrieveMusic() {
    mediaQueryQueue.async {
        let songsQuery = MPMediaQuery.songs()
        let songsCollections = songsQuery.collections
        for songCollection in songsCollections ?? [] {
            let songs = songCollection.items
            self.retrievedSongs.append(contentsOf: songs)
        }

        DispatchQueue.main.async {
            self.setLoadedSongsUIState()
            self.setupTableView()
            self.sortOrderDidChange()
        }
    }
}
然后,这些歌曲将显示在表格视图中:

func setTableViewItems(_ songs: [MPMediaItem]) {
    let section = self.tableViewAdaptor!.sections[0] as! TableViewAdaptorSection<SongTableViewCell, MPMediaItem>
    section.items = songs
    tableViewAdaptor.tableView.reloadData()
}
用户可以使用按钮播放/暂停,并转到下一个或上一个曲目:

@IBAction func forwardButtonPressed(_ sender: Any) {
    musicPlayer.skipToNextItem()
    selectPlayingItem(scrollToVisible: true)
}

@IBAction func backButtonPressed(_ sender: Any) {
    musicPlayer.skipToPreviousItem()
    selectPlayingItem(scrollToVisible: true)
}
此外,如果在表视图中选择一个曲目,则将播放该曲目:

    tableViewAdaptor = TableViewAdaptor(
        tableView: songTableView,
        sections: [songsLibrarySection],
        didChangeHandler: {
            let selectedSongIndex = self.songTableView.indexPathForSelectedRow
            if selectedSongIndex != nil {
                let selectedSong = self.retrievedSongs[selectedSongIndex!.row]
                self.musicPlayer.nowPlayingItem = selectedSong
                self.musicPlayer.play()
                self.updatePlaybackUI(scrollNowPlayingToVisible: true)
            }
        })
    setTableViewItems(retrievedSongs)
当歌曲按检索顺序显示时,一切都能正常工作。如果我单击后退或前进,或选择要播放的歌曲;正确的歌曲将按下一顺序播放

现在,如果您在order retrieved选项卡中,转到ordered by date选项卡并单击Backward或forward,则下一首歌曲将不是表视图中显示的下一首歌曲,而是在retrieved by order中


我要做的是更改代码,以便无论是显示检索到的歌曲还是已排序的歌曲,下一首或上一首歌曲都将与显示的内容相对应。

根据我的测试,在播放过程中更改项目的顺序可以正常工作。可能您的表视图在显示顺序不正确的歌曲时出现了一些UI问题。问题可能出现在以下句子中:“musicPlayer.setQueuewith:queueDescriptor”您是否尝试在再次设置musicPlayer队列之前清除该队列。如果您可以共享整个代码,那么检查我们所有人会更容易。@wazowski-hmm,也许吧!设置播放机队列的所有代码都在问题中,thoguh。@narner我在尝试将视频数组洗牌到AVPlayer中时遇到同样的问题,我必须重置整个播放机,以便将新的视频数组设置为以正确的方式排序。我没有找到解决方案,所以我决定使用RxSwift映射数组并尝试将其洗牌。这确实起到了作用,但代价是安装一个框架。
    tableViewAdaptor = TableViewAdaptor(
        tableView: songTableView,
        sections: [songsLibrarySection],
        didChangeHandler: {
            let selectedSongIndex = self.songTableView.indexPathForSelectedRow
            if selectedSongIndex != nil {
                let selectedSong = self.retrievedSongs[selectedSongIndex!.row]
                self.musicPlayer.nowPlayingItem = selectedSong
                self.musicPlayer.play()
                self.updatePlaybackUI(scrollNowPlayingToVisible: true)
            }
        })
    setTableViewItems(retrievedSongs)