Уничтожение экземпляров AVPlayer в UITableView
У меня есть UITableViewController с 2 кнопками в шапке.
Кнопка 1 - извлекает данные из API имени пользователя, обновляет представление таблицы и отображает одну строку имени пользователя на ячейку
Кнопка 2 - извлекает данные из API видео, обновляет представление таблицы и отображает один экземпляр AVPlayer на ячейку.
Когда я нажимаю кнопку видео, в каждой ячейке красиво отображается видео.
Когда я нажимаю кнопку имени пользователя, я вижу внизу табличное представление имени пользователя, но поверх него находятся все видео, которые отказываются быть уничтоженными. Мне нужно найти способ уничтожить их.
Любые идеи, как уничтожить несколько экземпляров AVPlayer, по одному в строке таблицы, мгновенно?
UITableViewController: PFQueryTableViewController
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object {
static NSString *CellIdentifier = @"Cell";
//the userOrVideoString is a string property assigned a value whenever the user presses the user or video button
if([self.userOrVideoString isEqualToString:@"video"]) {
VideoCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[VideoCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSString *dateString = [NSDateFormatter localizedStringFromDate:object.updatedAt
dateStyle:NSDateFormatterShortStyle
timeStyle:NSDateFormatterFullStyle];
PFFile *file = [object objectForKey:@"videoFile"];
Video *vid = [Video videoWithStringURL:file.url];
//problem - easy to init these videos, can't delete them though?
[cell setVideo:vid];
[cell play];
cell.textLabel.text = dateString;
return cell;
}
else {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSString *username = [object objectForKey:@"username"];
cell.textLabel.text = username ;
return cell;
}
}
-(void) didPressUserButton {
self.userOrVideoString = @"User";
[self.tableView reloadData];
[self loadObjects];
}
-(void) didPressVideoButton {
self.userOrVideoString = @"video";
[self.tableView reloadData];
[self loadObjects];
}
Пользовательская VideoCell: UITableViewCell
- (void)setVideo:(Video *)video
{
NSLog(@"%s : %@", __PRETTY_FUNCTION__, video);
//videoPlayer is an AVPlayer as a property
[self.videoPlayer replaceCurrentItemWithPlayerItem:[AVPlayerItem playerItemWithAsset:video.video]];
[self.videoPlayer setActionAtItemEnd:AVPlayerActionAtItemEndNone];
self.videoLayer = [AVPlayerLayer playerLayerWithPlayer:self.videoPlayer];
[self.videoLayer setPlayer:self.videoPlayer];
[self.videoLayer setBackgroundColor:[[UIColor blackColor] CGColor]];
[self.videoView.layer addSublayer:self.videoLayer];
self.videoPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playerItemDidReachEnd:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:[self.videoPlayer currentItem]];
// Here we add an KVO to the player to know when the video is ready to play
// This is important if you want the user to see something while the video is being loaded
[self.videoPlayer addObserver:self forKeyPath:@"status" options:0 context:nil];
// Here we need to add the indicator to the video views layer
// Then start animating
// But if the video is already ready to play, then we dont add it
// This case comes up when the video has been cached like we have done so
// and the cell is being reused
if ([self.videoPlayer status] != AVPlayerStatusReadyToPlay) {
[self.videoView.layer addSublayer:[self.indicator layer]];
[self.indicator startAnimating];
}
}
- (void)play
{
[self.videoPlayer play];
}