相关疑难解决方法(0)

在UITableView中更改AVPlayer的playerItem

我有一个UITableView包含滚动时要播放的视频.由于tableView中的单元格正在被重用,我只会AVPlayer为每一行实例化一个.当一个单元被重用时,我只需PlayerItem通过调用来改变单元的播放器[self.player replaceCurrentItemWithPlayerItem:newItem];.目前这是内部间接调用的tableView:cellForRowAtIndexPath.向下滚动时,重新使用时会出现明显的延迟.通过消除过程,我得出结论,滞后是replaceCurrentItemWithPlayerItem在它开始播放之前引起的.当删除这一行代码(阻止播放器获取新视频)时,滞后消失.

我试图解决它:

我有一个UITableViewCell播放这些视频的自定义,我在这些视频中创建了一个方法,用来自对象的新信息进行初始化.IE,在cellForRowAtIndexPath:我打电话[cell initializeNewObject:newObject];中执行以下方法:

//In CustomCell.m
-(void)initializeNewObject:(CustomObject*)newObject
{ /*...*/
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        AVPlayerItem *xPlayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:newObject.url]];
        AVPlayer *dummy = self.player;
        [dummy replaceCurrentItemWithPlayerItem:xPlayerItem];
        dispatch_async(dispatch_get_main_queue(), ^{
            self.player = dummy;
            playerItem = xPlayerItem;
        }
    }/*...*/
}
Run Code Online (Sandbox Code Playgroud)

运行此操作时,我得到的结果与完全删除更换项目的调用相同.显然,这个函数不能被线程化.我不完全确定我对此的期望.我会想象我需要一个干净copyAVPlayer这个工作,但搜索了一下后,我发现了一些意见指出,replaceCurrentItemWithPlayerItem:不能在一个单独的线程,这是没有意义的我被调用.我知道UI元素永远不应该在除main/UI-thread之外的其他线程中处理,但我绝不会想到replaceCurrentItemWithPlayerItem属于这个类别.

我现在正在寻找一种方法来改变一个AVPlayer没有滞后的项目,但找不到任何.我希望我已经理解了这个函数的错误,并且有人会纠正我.

编辑: 我现在已被告知此调用已经线程化,这不应该发生.但是,我没有看到其他解释..下面是我的cellForRowAtIndexPath:.它位于自定义内UITableView,委托设置为self(so self …

multithreading cocoa-touch objective-c ios avplayer

40
推荐指数
1
解决办法
5310
查看次数

标签 统计

avplayer ×1

cocoa-touch ×1

ios ×1

multithreading ×1

objective-c ×1