首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >可以“重用”AVPlayerLayer吗?从superview中删除单元格重用会影响我的性能

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

Stack Overflow用户
提问于 2014-12-11 22:06:52
回答 1查看 1.4K关注 0票数 3

我已经创建了一个真正简单的player类,并将其添加为自定义uitableviewcell的属性。我对滚动效果相当满意,但我认为它还可以更好。我有一个"cleanup“方法,我从player类中调用它来准备重用player。

代码语言:javascript
复制
-(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“的代码

代码语言:javascript
复制
    -(void)cleanPlayer{

   [self.avPlayerView removeFromSuperview];

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


}

如果我从cleanPlayer方法中删除了self.avPlayerView removeFromSuperview行,那么滚动效果会令人惊叹,但滚动一段时间后,单元格停止播放视频,错误的视频开始显示在单元格中。每次创建单元格时,添加回来的代码都会导致轻微的“卡顿”,这有点烦人。任何关于正在发生的事情的见解都将受到极大的赞赏。哦,我已经使用了剖析器,但在确定原因方面没有发现任何有用的东西。提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2015-07-20 17:06:48

我不认为你应该每次都清除你的玩家和它的层。

你可以在UITableViewCell.awakeFromNib()中实例化一个播放器和它的层,然后在需要的时候调用AVPlayer.replaceCurrentItemWithPlayerItem(newItem)

例如,您可以在UITableView.cellForRowAtIndexPath(indexPath)中这样做。您还可以在UITableViewCell.prepareForReuse()中添加AVPlayer.replaceCurrentItemWithPlayerItem(nil)

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

希望这能有所帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27424779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档