另一个更新强烈建议使用 Facebook 的异步显示套件 ASVideoNode 作为 AVPlayer 的替代品。在加载和播放视频时,您将获得如丝般流畅的 Instagram 桌面视图性能。我认为 AVPlayer 在主线程上运行一些进程,并且没有办法绕过它们,因为它发生在相对较低的级别。
更新:已解决
我无法直接解决这个问题,但我使用了一些技巧和假设并获得了我想要的性能。
假设是没有办法避免视频在主线程上加载一定的时间(除非你是 instagram 并且你拥有一些 AsyncDisplayKit 魔法,但我不想进行这种跳跃),所以改为尝试删除 UI 块时,请尝试隐藏它。
我通过实现一个简单的方法隐藏了 UIBlock正在滚动检查我的 tableView
func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
if(self.isScrolling){
if(!decelerate){
self.isScrolling = false
self.tableView.reloadData()
}
}
}
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
if(self.isScrolling){
self.isScrolling = false
self.tableView.reloadData()
}
}
func scrollViewWillBeginDragging(scrollView: UIScrollView) {
self.isScrolling = true
}
然后确保在 tableView 滚动或视频已经播放时不加载视频单元格,并在滚动停止时重新加载 tableView 。
if(!isScrolling && cell.videoPlayer == nil){
//Load video cell here
}
但请确保删除 videoPlayer,并在 videoCell 不再出现在屏幕上时停止监听重播通知。
func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
if(tableView.indexPathsForVisibleRows?.indexOf(indexPath) == nil){
if (cell.videoPlayer != nil && murmur.video_url != nil){
if(cell.videoPlayer.rate != 0){
cell.videoPlayer.removeObserver(cell, forKeyPath: "status")
cell.videoPlayer = nil;
cell.videoPlayerController.view.alpha = 0;
}
}
}
}
通过这些更改,我能够在屏幕上同时显示多个 (2) 个视频单元,从而实现流畅的 UI。希望这对您有所帮助,如果您有任何具体问题或者我所描述的内容不清楚,请告诉我。