可以“重用”AVPlayerLayer吗?从superview中删除单元格重用会影响我的性能

时间:2014-12-11 14:06:52

标签: 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] 行,滚动是令人惊讶的,但滚动了相当多次后,单元格停止播放视频,错误的视频开始显示在细胞中。每次创建单元格时,添加代码会导致轻微的“打嗝”,这有点烦人。任何有关正在发生的事情的见解将不胜感激。哦,我已经使用过探查器,并且在确定原因时没有发现任何有用的东西。提前谢谢!

1 个答案:

答案 0 :(得分:1)

我不认为你应该每次都清理你的玩家及其层。

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

您可以在UITableView.cellForRowAtIndexPath(indexPath)中执行此操作。您还可以在AVPlayer.replaceCurrentItemWithPlayerItem(nil)

中添加UITableViewCell.prepareForReuse()

这可能看起来有点棘手,但没有必要在这里删除任何东西;)

希望这会有所帮助!