gpt4 book ai didi

ios - 从 MPMediaLibrary 获取大量歌曲到 UITableView 中

转载 作者:行者123 更新时间:2023-11-30 11:43:11 24 4
gpt4 key购买 nike

我有一个表格 View ,其中包含音乐库中所有歌曲的列表。首先,我获取所有歌曲并将其信息保存到如下数组中:

var songs = [Song]()
private func loadSongs(){
let itunesSongs = MPMediaQuery.songs().items
if itunesSongs == nil {
return;
}
for song in itunesSongs!{
let artist = song.albumArtist
let trackTitle = song.title
let image = song.artwork?.image(at: CGSize(width: 90, height: 90))
let url = song.assetURL?.absoluteString ?? ""
let song1 = Song(title: trackTitle ?? "", artist: artist ?? "", image: image, url: url)
songs.append(song1)
}
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellIdentifier = "SongTableViewCell"
guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? SongCell else {
fatalError("The dequeued cell is not an instance of SongCell.")
}
let song = playerManager.songs[indexPath.row]
cell.setAttributes(song: song)

cell.preservesSuperviewLayoutMargins = false
return cell
}

当我在拥有超过 10000 首歌曲的设备上测试此功能时,启动应用程序大约需要 5-10 秒。因此,我修改了填充 TableView 的方式,如下所示:

var itunesSongs: MPMediaQuery.songs().items
func getSong(index: Int) -> Song {
if(index >= songs.count){
let song = itunesSongs![index]
let ans = Song(title: song.title ?? "", artist: song.albumArtist ?? "", image: song.artwork?.image(at: CGSize(width: 90, height: 90)), url: song.assetURL?.absoluteString ?? "")
songs.append(ans)
}
return songs[index]
}

所以我会在 tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) 中使用 getSong() 而不是使用 songs 数组。

问题已解决,应用程序正常启动。但是,有时,我会在 returnongs[index] 行上收到 Fatal error: Index out of range 。当我快速滚动时会发生这种情况,并且每次都会发生不同的索引。我尝试一次获取 100 首歌曲而不是 1 首,但这也没有解决问题。

我正在考虑使用后台线程来填充 songs 数组,但不确定这是否是正确的方法。

最佳答案

问题是 TableView 没有顺序调用getSong()。例如, TableView 可以调用 getSong(6),然后调用 getSong(3)。我将函数更新为:

func getSong(index: Int) -> Song {
while (index >= songs.count){
let song = itunesSongs![songs.count]

let ans = Song(title: song.title ?? "", artist: song.albumArtist ?? "", image: song.artwork?.image(at: CGSize(width: 90, height: 90)), url: song.assetURL?.absoluteString ?? "")
songs.append(ans)
}
return songs[index]
}

关于ios - 从 MPMediaLibrary 获取大量歌曲到 UITableView 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49118205/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com