uitableview - 可能到 "reuse"AVPlayerLayer?从 superview 中删除单元重用会影响我的性能

标签 uitableview avplayer avplayerlayer

我创建了一个真正简单的播放器类,并将其添加为自定义 uitableviewcell 的属性。我对滚动感到相当满意,但认为它可以做得更好。我有一个“清理”方法,我从播放器类中调用该方法来准备要重复使用的播放器。

-(void)URLFromWeb:(NSURL*)URL{


    [self cleanPlayer];



    AVAsset* avAsset = [AVAsset assetWithURL:URL];
    AVPlayerItem *playerItem =[[AVPlayerItem alloc]initWithAsset:avAsset];

    if (!self.player) {

        self.player = [AVPlayer playerWithPlayerItem:playerItem];
        [self.player setActionAtItemEnd:AVPlayerActionAtItemEndNone];

    }

    if (!self.avPlayerLayer) {


        self.avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
        self.avPlayerView = [[UIView alloc] initWithFrame:CGRectZero];
        [self.avPlayerView.layer addSublayer:self.avPlayerLayer];

        [self addSubview:self.avPlayerView];

        [self.avPlayerLayer setFrame:CGRectMake(0, 0, 320, 320)];

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(playerPlayedToEnd:)
                                                     name:AVPlayerItemDidPlayToEndTimeNotification
                                                   object:nil];
    }

    [self.avPlayerView removeFromSuperview];
    [self addSubview:self.avPlayerView];

}

这是“cleanPlayer”的代码

    -(void)cleanPlayer{

   [self.avPlayerView removeFromSuperview];

    self.avPlayerView = nil;
    self.avPlayerLayer = nil;
    self.player = nil;


}

如果我从 cleanPlayer 方法中删除 [self.avPlayerView removeFromSuperview] 行,滚动是惊人的,但是在滚动相当多次后,单元格停止播放视频并开始显示错误的视频在细胞中。每次创建单元格时,重新添加代码都会导致轻微的“打嗝”,这有点烦人。任何对正在发生的事情的见解将不胜感激。哦,我已经使用了探查器,但在确定原因方面没有发现任何有用的东西。提前致谢!

最佳答案

我认为您不应该每次都清除您的播放器及其图层。

您可以在 UITableViewCell.awakeFromNib() 中实例化播放器及其图层,然后在需要时调用 AVPlayer.replaceCurrentItemWithPlayerItem(newItem)

例如,您可以在 UITableView.cellForRowAtIndexPath(indexPath) 中执行此操作。您还可以在 UITableViewCell.prepareForReuse()

中添加一个 AVPlayer.replaceCurrentItemWithPlayerItem(nil)

这似乎有点棘手,但没有必要在这里删除任何东西;)

希望这会有所帮助!

关于uitableview - 可能到 "reuse"AVPlayerLayer?从 superview 中删除单元重用会影响我的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27424779/

相关文章:

ios - UITableView 和 NSFetchedResultsController 内存泄漏

ios - Swift - 当 AVPlayer 在后台模式下被覆盖时如何发送通知?

iphone - 在设备锁定时播放 iPod 库中的音频

ios - 在 AVPlayerLayer 上拉伸(stretch)视频

ios - 里面有 TableView 的动态 Collection View 单元格?

ios - 数据传递失败

ios - 带有 AVPlayer 的多个视频

ios - AVPlayer 层不显示视频内容

ios - 如何从另一种方法重新加载 Tableview 数据

python - 使用 Flask 提供 .mp4 文件并在 Objective-C 应用程序上播放会导致管道损坏且无法播放