ビデオをファイルパスにダウンロードすると、テーブルビューに表示されるために [tableview reloadData] が必要なのはなぜですか?
私はこの問題で 3 日間立ち往生しており、非常に当惑しています。devforum がダウンしているのは残念です。
基本的に、私はテーブルビューを持っています。各テーブル ビュー セルには、AVPlayer と特定のリモート URL があります。cellForRowAtIndexPath では、ビデオ データがローカルに保存されていない場合、ダウンロードしてファイルに保存し、AVPlayer は保存されたファイルの場所でビデオの再生を試みます。
問題は、何も再生されないことです。
ビデオをレンダリングするため[tableView reloadData]
にそれぞれを呼び出さない限り。cellForRowAtIndexPath
これはパフォーマンスに非常に悪いだけでなく、ユーザーにとってもあまり良くない可能性があることに気付いたので、reloadRowsAtIndexPath
各セルを使用しようとしましたが、うまくいきません。
特定のローカル ファイルの場所からデータを読み込むために、アプリで reloadData を呼び出す必要があるのはなぜですか? reloadRowsAtIndexPath が機能しないのはなぜですか? 最近ファイル パスに書き込まれたビデオ データを取得するという点で、2 つの違いは何ですか。
テーブルビューをリロードしないと、アプリが特定のファイルパスの新しいデータを認識しないだけです。
コード
- (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];
}