尝试在 uitableview 中通过 AVPlayer 播放音乐,但播放的音乐错误(从 Firebase 加载错误的音乐)

Trying to play music through AVPlayer in a uitableview, but the wrong music is being played (wrong music is being loaded from Firebase)

所以我有一个 UITableViewController,每个单元格内都有一个播放按钮和一个暂停按钮,以便播放音乐。当您按下播放按钮时,它应该播放特定于该单元格的音乐,但是当我 运行 我的代码时,它会播放随机音频,而不是我专门为其加载的音频。此外,当我滚动浏览 tableview 时,音频停止播放。为什么会这样,我该如何解决?如果按下不同单元格中的播放按钮,我还希望它切换歌曲。

这是我用来加载唯一字符串(由 post.mp3 生成)以在我的 AVPlayer 中找到 url 文件的函数:

func loadAudio(post: CompPost, completion: @escaping (URL) -> ())
    {
        let audioRef = Storage.storage().reference().child("cPosts").child(post.uid).child("Audio").child(post.mp3)
        audioRef.downloadURL
        { (url, error) in
            print("mp3filename: " + post.mp3)
            guard error == nil else
            {
                print(error!.localizedDescription)
                return /**alert**/
            }
            self.audioPlayer = AVPlayer(playerItem: AVPlayerItem(url: url!))
            completion(url!)
        }
    }

这是为每个单元格加载唯一 url 的代码:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cPostCell", for: indexPath) as! cPostCell
            
        cell.delegate = self
        cell.index = indexPath
        
        //other code omitted for brevity

        loadAudio(post: compPosts[indexPath.row])
        { (url) in
            print("THIS IS THE URL")
            print(url)
        }
        
        return cell
    }

点击播放按钮的函数:

func playMusic(index: Int)
    {
        audioPlayer.play()
        isPlaying = true
        print("playing now")
    }

问题是当你触发 audioPlayer.play() 时你没有加载新的 AVPlayerItem 到你的 AVPlayer 因此当你点击播放按钮时,播放器开始播放加载的项目在您上次加载的 tableViewCell 中。尝试将所有 playerItems 保存到带有一些索引的数组中,当用户点击带有索引的按钮时,您将加载音频并在加载中将新的 AVPlayerItem 分配给 AVPlayer :

 audioPlayer = AVPlayer(playerItem: yourPlayerItemArray[index]))

然后触发 audioPlayer.play()