AVPlayer вызывает TableView To Lag - PullRequest
0 голосов
/ 01 мая 2019

Мне нужно воспроизвести видео в моем приложении внутри ячейки tableView. В зависимости от размера экрана в моей таблице может отображаться 2 ячейки в устройстве с небольшим экраном и 3 ячейки в устройстве с большим экраном, например iPhone XSMax или Xr

Поток AVPlayerController Класс создан

class CustomAVPlayerViewController: AVPlayerViewController {
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("touchesBegan")
    }
}

Экземпляры, созданные в классе ячеек

var myImgArray=[String]()
    var myVideoArray=[String]()
    var myVideoPlayer : AVPlayer?
    var videoPlayerController : CustomAVPlayerViewController?
    var myPlayerItems=[AVPlayerItem]()

Подготовка к повторному использованию функций

override func prepareForReuse() {
        myVideoPlayer?.replaceCurrentItem(with: nil)
        videoPlayerController=nil
        myVideoPlayer=nil
        self.count=0
        myPlayerItems.removeAll()
        myImgArray.removeAll()
        myVideoArray.removeAll()
        NotificationCenter.default.removeObserver(NSNotification.Name.AVPlayerItemDidPlayToEndTime)
        for vieww in myScrollView.subviews {
            vieww.removeFromSuperview()
        }

    }

Я использую AVPLayer экземпляр один для ячейки. Одна ячейка может содержать несколько видео, поэтому для этого используется прокрутка

if !videoArray.isEmpty {
            /// We've Videos
            for i in 0..<videoArray.count {
                ///Get Origin
                let xOrigin : CGFloat = CGFloat(i) * myScrollView.frame.size.width + (CGFloat(imgArray.count)*myScrollView.frame.size.width)
                let newPlayerItem = AVPlayerItem(url: URL(string: videoArray[i])!)
                myPlayerItems.append(newPlayerItem)
                if i == 0 {
                    self.myVideoPlayer=AVPlayer(playerItem: newPlayerItem)
                    self.videoPlayerController = CustomAVPlayerViewController()
                    NotificationCenter.default.removeObserver(NSNotification.Name.AVPlayerItemDidPlayToEndTime)
                    NotificationCenter.default.addObserver(self, selector: #selector(self.playerDidFinishPlaying(note:)), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: self.myVideoPlayer!.currentItem)
                    self.videoPlayerController?.player = self.myVideoPlayer!
                    self.videoPlayerController?.view.frame = CGRect(x: xOrigin+10, y: 10, width: self.myScrollView.frame.size.width-20, height: self.myScrollView.frame.size.height-20)
                    self.myVideoPlayer?.play()
                    myScrollView.addSubview(self.videoPlayerController!.view)
                    myScrollView.bringSubviewToFront(self.videoPlayerController!.view)
                }
            }
        }

Как показано в приведенном выше коде, я перебираю Video Array и добавляю его подпредставление в scrollView

Выпуск -

оно начинает лагать, когда на экране несколько ячеек с видео или следующая загружаемая ячейка с видео

Я использую prepareForReuse, чтобы избежать высокого использования памяти. Время работы приложения составляет до 40 МБ в течение 4 минут, включая и другие функции

Что я могу сделать?

Испытанные вещи

  1. Проверка IndexPathForVisibleCell включает три ячейки, которые отображаются, как только моя ячейка выходит за пределы экрана. Я удаляю подпредставления scrollView и экземпляр AVPLayer.

  2. Использование Global AVPLayer Экземпляр, но не сработал. Не воспроизводит видео Причина - когда на экране отображаются три ячейки, они не удаляются снова, поэтому видео не будет загружено, поскольку глобальный экземпляр будет добавлен только в одну, а prepareForReuse не будет воспроизводить видео

1 Ответ

0 голосов
/ 01 мая 2019

Может отставать, потому что вы добавляете и удаляете представление AVPlayer. Вместо того, чтобы удалять их, вы можете использовать их повторно, чтобы обновить ссылку, когда ячейка видна на экране. Вы можете ссылаться на любую статью следующим образом: Лучший способ проверить, полностью ли виден UITableViewCell

...