AVPlayer导致TableView滞后

时间:2019-05-01 12:44:06

标签: ios swift uitableview tableview avplayer

我必须在tableView单元内的App中播放视频。根据视图屏幕大小,我的表可以在小屏幕设备中显示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来避免高内存使用率。 应用程序在4分钟的运行时间内可循环到40 MB,其中还包括其他功能

我能做什么?

尝试过的事情

  1. 选中IndexPathForVisibleCell,其中包含三个单元格,当我的单元格离开屏幕时,将立即显示这些单元格。

  2. 使用全局AVPLayer实例,但是没有用。它不播放视频 原因-当三个单元格出现在屏幕上时,它将不会再次出队,因此不会加载视频,因为全局实例只会添加到一个中,并且prepareForReuse不会导致视频播放

1 个答案:

答案 0 :(得分:0)

它可能会滞后,因为您添加和删除了AVPlayer视图。 您可以重用它们,而不是删除它们,以便可以在屏幕上显示该单元时更新链接。 您可以参考以下任何文章:Best way to check if UITableViewCell is completely visible

相关问题