Воспроизведение аудио и видео файлов один за одним в UITableView


#1

Пользователь в приложении видит таблицу с аудио и видео файлами, приходящие от сервера, отсортированные по дате создания. Чтобы воспроизвести файл нужно нажать на ячейку. Задача: как сделать, чтобы после окончания проигрывания файла сразу же начиналось проигрывания следующего?

В UITableView при нажатии на ячейку реализуется в UIViewController:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("indexPath.row:", indexPath.row)
        let record = self.records[indexPath.row]
        let mainTabBarController =  UIApplication.shared.keyWindow?.rootViewController as? MainTabBarController
        mainTabBarController?.minimizePlayerDetails(record: record)
        tableView.deselectRow(at: indexPath, animated: true)
    }

Воспроизведение реализуется в class PlayerDetailsView: UIView:

fileprivate func playRecord () {
        guard let url = URL(string: record.recordUrl) else { return }
        let playItem = AVPlayerItem(url: url)
        player.replaceCurrentItem(with: playItem)
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playItem)
        player.play()
      
    }
    
    @objc func playerDidFinishPlaying(note: NSNotification) {
//        print("Player finished")
        currentTimeSlider.setValue(0, animated: true)
        currentTimeLabel.text = "00:00"
        self.playPause.setImage(#imageLiteral(resourceName: "PlayPlayer"), for: .normal)
        self.miniPlayPauseButton.setImage(#imageLiteral(resourceName: "PlayPlayerMini"), for: .normal)
        let zero = CMTime(seconds: 0.0, preferredTimescale: 1)
        player.seek(to: zero, toleranceBefore: zero, toleranceAfter: zero)
        player.pause()

    }

#2

Храните индекс текущего файла.
Когда проигрывание закончится, в методе playerDidFinishPlaying в самом конце увеличивайте индекс на 1 и проверяйте, есть ли такой индекс в массиве данных. Если есть, запускайте ваш playRecord с новым индексом.


#3

Идея ясна. Как сохранить текущий индекс? Если записи всего 2, то просто прибавить к существующему + 1, а если их 3 и воспроизведение началось с индекса 0, как перейти между индексом 1 и 2? Ну и как лучше проверить существование следующего индекса?


#4
  1. indexPath.row - ваш текущий индекс файла
  2. 0 - первый файл, 0+1=1 - второй файл, 1+1=2 - третий файл
  3. if index <= records.count - 1