Added deallocation of observers to prevent an NSInternalInconsistencyException.
This commit is contained in:
parent
b6c9a57ff2
commit
b15594e90a
26
RCTVideo.m
26
RCTVideo.m
@ -106,7 +106,7 @@ static NSString *const playbackRate = @"rate";
|
|||||||
{
|
{
|
||||||
return([playerItem duration]);
|
return([playerItem duration]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return(kCMTimeInvalid);
|
return(kCMTimeInvalid);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,6 +126,8 @@ static NSString *const playbackRate = @"rate";
|
|||||||
- (void)dealloc
|
- (void)dealloc
|
||||||
{
|
{
|
||||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||||
|
[self removePlayerItemObservers];
|
||||||
|
[_player removeObserver:self forKeyPath:playbackRate context:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - App lifecycle handlers
|
#pragma mark - App lifecycle handlers
|
||||||
@ -162,7 +164,7 @@ static NSString *const playbackRate = @"rate";
|
|||||||
if (video == nil || video.status != AVPlayerItemStatusReadyToPlay) {
|
if (video == nil || video.status != AVPlayerItemStatusReadyToPlay) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
CMTime playerDuration = [self playerItemDuration];
|
CMTime playerDuration = [self playerItemDuration];
|
||||||
if (CMTIME_IS_INVALID(playerDuration)) {
|
if (CMTIME_IS_INVALID(playerDuration)) {
|
||||||
return;
|
return;
|
||||||
@ -250,7 +252,7 @@ static NSString *const playbackRate = @"rate";
|
|||||||
|
|
||||||
_player = [AVPlayer playerWithPlayerItem:_playerItem];
|
_player = [AVPlayer playerWithPlayerItem:_playerItem];
|
||||||
_player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
|
_player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
|
||||||
|
|
||||||
[_player addObserver:self forKeyPath:playbackRate options:0 context:nil];
|
[_player addObserver:self forKeyPath:playbackRate options:0 context:nil];
|
||||||
_playbackRateObserverRegistered = YES;
|
_playbackRateObserverRegistered = YES;
|
||||||
|
|
||||||
@ -300,7 +302,7 @@ static NSString *const playbackRate = @"rate";
|
|||||||
if (isnan(duration)) {
|
if (isnan(duration)) {
|
||||||
duration = 0.0;
|
duration = 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
NSObject *width = @"undefined";
|
NSObject *width = @"undefined";
|
||||||
NSObject *height = @"undefined";
|
NSObject *height = @"undefined";
|
||||||
NSString *orientation = @"undefined";
|
NSString *orientation = @"undefined";
|
||||||
@ -442,7 +444,7 @@ static NSString *const playbackRate = @"rate";
|
|||||||
[_player play];
|
[_player play];
|
||||||
[_player setRate:_rate];
|
[_player setRate:_rate];
|
||||||
}
|
}
|
||||||
|
|
||||||
_paused = paused;
|
_paused = paused;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -468,7 +470,7 @@ static NSString *const playbackRate = @"rate";
|
|||||||
CMTime current = item.currentTime;
|
CMTime current = item.currentTime;
|
||||||
// TODO figure out a good tolerance level
|
// TODO figure out a good tolerance level
|
||||||
CMTime tolerance = CMTimeMake(1000, timeScale);
|
CMTime tolerance = CMTimeMake(1000, timeScale);
|
||||||
|
|
||||||
if (CMTimeCompare(current, cmSeekTime) != 0) {
|
if (CMTimeCompare(current, cmSeekTime) != 0) {
|
||||||
[_player seekToTime:cmSeekTime toleranceBefore:tolerance toleranceAfter:tolerance completionHandler:^(BOOL finished) {
|
[_player seekToTime:cmSeekTime toleranceBefore:tolerance toleranceAfter:tolerance completionHandler:^(BOOL finished) {
|
||||||
[_eventDispatcher sendInputEventWithName:@"onVideoSeek"
|
[_eventDispatcher sendInputEventWithName:@"onVideoSeek"
|
||||||
@ -541,7 +543,7 @@ static NSString *const playbackRate = @"rate";
|
|||||||
}
|
}
|
||||||
// Set presentation style to fullscreen
|
// Set presentation style to fullscreen
|
||||||
[_playerViewController setModalPresentationStyle:UIModalPresentationFullScreen];
|
[_playerViewController setModalPresentationStyle:UIModalPresentationFullScreen];
|
||||||
|
|
||||||
// Find the nearest view controller
|
// Find the nearest view controller
|
||||||
UIViewController *viewController = [self firstAvailableUIViewController];
|
UIViewController *viewController = [self firstAvailableUIViewController];
|
||||||
if( !viewController )
|
if( !viewController )
|
||||||
@ -589,9 +591,9 @@ static NSString *const playbackRate = @"rate";
|
|||||||
_playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];
|
_playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];
|
||||||
_playerLayer.frame = self.bounds;
|
_playerLayer.frame = self.bounds;
|
||||||
_playerLayer.needsDisplayOnBoundsChange = YES;
|
_playerLayer.needsDisplayOnBoundsChange = YES;
|
||||||
|
|
||||||
[_playerLayer addObserver:self forKeyPath:readyForDisplayKeyPath options:NSKeyValueObservingOptionNew context:nil];
|
[_playerLayer addObserver:self forKeyPath:readyForDisplayKeyPath options:NSKeyValueObservingOptionNew context:nil];
|
||||||
|
|
||||||
[self.layer addSublayer:_playerLayer];
|
[self.layer addSublayer:_playerLayer];
|
||||||
self.layer.needsDisplayOnBoundsChange = YES;
|
self.layer.needsDisplayOnBoundsChange = YES;
|
||||||
}
|
}
|
||||||
@ -654,7 +656,7 @@ static NSString *const playbackRate = @"rate";
|
|||||||
{
|
{
|
||||||
[self setControls:true];
|
[self setControls:true];
|
||||||
}
|
}
|
||||||
|
|
||||||
if( _controls )
|
if( _controls )
|
||||||
{
|
{
|
||||||
view.frame = self.bounds;
|
view.frame = self.bounds;
|
||||||
@ -686,7 +688,7 @@ static NSString *const playbackRate = @"rate";
|
|||||||
if( _controls )
|
if( _controls )
|
||||||
{
|
{
|
||||||
_playerViewController.view.frame = self.bounds;
|
_playerViewController.view.frame = self.bounds;
|
||||||
|
|
||||||
// also adjust all subviews of contentOverlayView
|
// also adjust all subviews of contentOverlayView
|
||||||
for (UIView* subview in _playerViewController.contentOverlayView.subviews) {
|
for (UIView* subview in _playerViewController.contentOverlayView.subviews) {
|
||||||
subview.frame = self.bounds;
|
subview.frame = self.bounds;
|
||||||
@ -713,7 +715,7 @@ static NSString *const playbackRate = @"rate";
|
|||||||
_player = nil;
|
_player = nil;
|
||||||
|
|
||||||
[self removePlayerLayer];
|
[self removePlayerLayer];
|
||||||
|
|
||||||
[_playerViewController.view removeFromSuperview];
|
[_playerViewController.view removeFromSuperview];
|
||||||
_playerViewController = nil;
|
_playerViewController = nil;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user