以获取的+上次播放的顺序显示和播放MPMediaItem歌曲

问题描述

我正在构建一个利用MPMusicPlayerApplicationController播放用户本地音乐库中的音乐的应用。

从库中检索歌曲的方式如下:

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()
}

我还有一个段控件,它将确定是按照检索歌曲的顺序显示歌曲,还是按照最后播放的顺序显示歌曲;然后根据选择的选项更新表格视图:

var retrievedSongs: [MPMediaItem] = []
var sortedSongs: [MPMediaItem] = []

private func sortOrderDidChange() {
        switch sortOrder {
        case .playDateDescending:
            let unixDate = Date(timeIntervalSince1970: 1000)
            sortedSongs = retrievedSongs.sorted {
                $0.lastPlayedDate ?? unixDate > $1.lastPlayedDate ?? unixDate
            }
        default:
            sortedSongs = retrievedSongs
        }
        
        setTableViewItems(sortedSongs)
        
        let queueDescriptor = MPMusicPlayerMediaItemQueueDescriptor(itemCollection: MPMediaItemCollection(items: sortedSongs))
        queueDescriptor.startItem = musicPlayer.NowPlayingItem
        musicPlayer.setQueue(with: queueDescriptor)
        
        selectPlayingItem(scrollToVisible: true)
    }

用户可以使用按钮播放/暂停,并转到下一个或上一个曲目:

@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)

按检索顺序显示歌曲时,一切正常。如果我单击后退或前进,或选择要播放的歌曲;正确的歌曲将以下一个顺序播放。

现在,如果您位于“检索到的订单”标签中,然后转到“按日期排序”标签,然后向后或向前单击,则下一首歌曲将不再是表格视图中显示的下一首歌曲,而是按顺序“撤回”。

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)