1

为什么将视频下载到文件路径需要 [tableview reloadData] 才能在 tableview 上看到?

我已经在这个问题上停留了 3 天,我很困惑,而且 devforum 已经关闭了,这太糟糕了。

基本上,我有一个表格视图。每个表格视图单元都有一个 AVPlayer 和一个给定的远程 URL。在 cellForRowAtIndexPath 中,如果视频数据没有存储在本地,它会下载并保存到文件中,AVPlayer 会尝试在保存的文件位置播放视频。

问题是,什么都没有播放。

除非我打电话给[tableView reloadData]每个cellForRowAtIndexPath人以便渲染视频。我意识到这可能对性能非常不利,而且对用户来说也不是很好,所以我尝试使用reloadRowsAtIndexPathfor each cell,但这不起作用。

为什么我的应用需要调用 reloadData 才能从给定的本地文件位置加载数据?为什么 reloadRowsAtIndexPath 不起作用?就获取最近写入文件路径的视频数据而言,两者有什么区别。

我宁愿不重新加载任何东西,只是如果我不重新加载表格视图,应用程序不知道给定文件路径中的新数据。


代码

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        static NSString *const cellIdentifier = @"cellIdentifier";
        AVideoTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        AVURLAsset *asset = [AVURLAsset URLAssetWithURL:[self getURL:someURLString forIndexPath:indexPath] options:nil];
        AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset];
        if (!cell) {
            cell = [[AVideoTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
            cell.player = [[AVPlayer alloc] initWithPlayerItem:playerItem];
            AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:cell.player];
            cell.player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
            layer.frame = CGRectMake(10.0, 10.0, 300.0, 179.0);
            [cell.layer addSublayer: layer];
        }
        else {
            [cell.player replaceCurrentItemWithPlayerItem:playerItem];
        }
        [cell.player play];

    }
4

2 回答 2

0

所以你想在每个表格单元格中播放视频?那是行不通的。视频播放非常耗费资源。将视频层添加到每个都有自己的播放器的表格视图单元格是不可能的。如果没有正确完成,表格视图很难在静止图像上表现良好。在表格单元格中实时显示视频几乎是不可能的。你需要重新考虑你的设计方法。也许只是为表格单元格中的每个视频加载海报图像,然后在用户点击单元格时播放?

但是,如果您坚持走这条路线以便您自己查看,我的猜测是您可能没有使用正确的 NSURL 方法来实例化您的文件 URL。在这一行设置断点:

AVURLAsset *asset = [AVURLAsset URLAssetWithURL:
                      [self getURL:someURLString forIndexPath:indexPath] 
                                        options:nil];

然后跨过那条线,然后将鼠标悬停在资产变量上。如果它为 nil,则说明您在getURL:forIndexPath:方法中实例化的 NSURL 有问题。

确保您[NSURL fileURLWithPath:]用于从磁盘加载它。iOS 对文件 URL 和 Web URL 进行了区分。还要确保您的文件确实存在于您正在使用的文件 URL 中。

于 2013-07-23T20:44:16.867 回答
0

我认为这是一个异步/同步问题。

我正在使用 AFNetworking 以 getURL 方法下载文件。

[operation waitUntilFinished]

^这解决了这个问题。我猜,在 getURL 方法返回本地 URL 之前,没有下载整个文件,因此资产可能已经损坏。

唯一的问题是,我担心对于缓慢的互联网连接,主线程可能会被阻塞太久。每个视频大约 140KB。

如果您知道,一种不会阻塞主线程的更好方法请告诉我。

很高兴在紧张的三天之后终于弄明白了。:)

于 2013-07-23T21:55:41.163 回答