Fix crash from trying to remove observer multiple times
This commit is contained in:
		
										
											Binary file not shown.
										
									
								
							@@ -7,7 +7,7 @@
 | 
				
			|||||||
		<key>RCTVideo.xcscheme</key>
 | 
							<key>RCTVideo.xcscheme</key>
 | 
				
			||||||
		<dict>
 | 
							<dict>
 | 
				
			||||||
			<key>orderHint</key>
 | 
								<key>orderHint</key>
 | 
				
			||||||
			<integer>10</integer>
 | 
								<integer>12</integer>
 | 
				
			||||||
		</dict>
 | 
							</dict>
 | 
				
			||||||
	</dict>
 | 
						</dict>
 | 
				
			||||||
	<key>SuppressBuildableAutocreation</key>
 | 
						<key>SuppressBuildableAutocreation</key>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,7 @@
 | 
				
			|||||||
    "start": "node_modules/react-native/packager/packager.sh"
 | 
					    "start": "node_modules/react-native/packager/packager.sh"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "react-native": "^0.4.0",
 | 
					    "react-native": "^0.4.4",
 | 
				
			||||||
    "react-native-video": "^0.3.5"
 | 
					    "react-native-video": "^0.4.1"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										27
									
								
								RCTVideo.m
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								RCTVideo.m
									
									
									
									
									
								
							@@ -18,6 +18,7 @@ static NSString *const statusKeyPath = @"status";
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  AVPlayer *_player;
 | 
					  AVPlayer *_player;
 | 
				
			||||||
  AVPlayerItem *_playerItem;
 | 
					  AVPlayerItem *_playerItem;
 | 
				
			||||||
 | 
					  BOOL _playerItemObserverSet;
 | 
				
			||||||
  AVPlayerLayer *_playerLayer;
 | 
					  AVPlayerLayer *_playerLayer;
 | 
				
			||||||
  NSURL *_videoURL;
 | 
					  NSURL *_videoURL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -87,18 +88,36 @@ static NSString *const statusKeyPath = @"status";
 | 
				
			|||||||
  [_progressUpdateTimer addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
 | 
					  [_progressUpdateTimer addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- (void)notifyEnd: (NSNotification *)notification {
 | 
					- (void)notifyEnd:(NSNotification *)notification
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    [_eventDispatcher sendInputEventWithName:RNVideoEventEnd body:@{
 | 
					    [_eventDispatcher sendInputEventWithName:RNVideoEventEnd body:@{
 | 
				
			||||||
        @"target": self.reactTag
 | 
					        @"target": self.reactTag
 | 
				
			||||||
    }];
 | 
					    }];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- (void)addPlayerItemObserver
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  [_playerItem addObserver:self forKeyPath:statusKeyPath options:0 context:nil];
 | 
				
			||||||
 | 
					  _playerItemObserverSet = YES;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Fixes https://github.com/brentvatne/react-native-video/issues/43
 | 
				
			||||||
 | 
					 * Crashes caused when trying to remove the observer when there is no
 | 
				
			||||||
 | 
					 * observer set */
 | 
				
			||||||
 | 
					- (void)removePlayerItemObserver
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (_playerItemObserverSet) {
 | 
				
			||||||
 | 
					    [_playerItem removeObserver:self forKeyPath:statusKeyPath];
 | 
				
			||||||
 | 
					    _playerItemObserverSet = NO;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma mark - Player and source
 | 
					#pragma mark - Player and source
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- (void)setSrc:(NSDictionary *)source {
 | 
					- (void)setSrc:(NSDictionary *)source {
 | 
				
			||||||
  [_playerItem removeObserver:self forKeyPath:statusKeyPath];
 | 
					  [self removePlayerItemObserver];
 | 
				
			||||||
  _playerItem = [self playerItemForSource:source];
 | 
					  _playerItem = [self playerItemForSource:source];
 | 
				
			||||||
  [_playerItem addObserver:self forKeyPath:statusKeyPath options:0 context:nil];
 | 
					  [self addPlayerItemObserver];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  [_player pause];
 | 
					  [_player pause];
 | 
				
			||||||
  [_playerLayer removeFromSuperlayer];
 | 
					  [_playerLayer removeFromSuperlayer];
 | 
				
			||||||
@@ -321,7 +340,7 @@ static NSString *const statusKeyPath = @"status";
 | 
				
			|||||||
  [_playerLayer removeFromSuperlayer];
 | 
					  [_playerLayer removeFromSuperlayer];
 | 
				
			||||||
  _playerLayer = nil;
 | 
					  _playerLayer = nil;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  [_playerItem removeObserver:self forKeyPath:statusKeyPath];
 | 
					  [self removePlayerItemObserver];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _eventDispatcher = nil;
 | 
					  _eventDispatcher = nil;
 | 
				
			||||||
  [[NSNotificationCenter defaultCenter] removeObserver:self];
 | 
					  [[NSNotificationCenter defaultCenter] removeObserver:self];
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "react-native-video",
 | 
					  "name": "react-native-video",
 | 
				
			||||||
  "version": "0.4.0",
 | 
					  "version": "0.4.1",
 | 
				
			||||||
  "description": "A <Video /> element for react-native",
 | 
					  "description": "A <Video /> element for react-native",
 | 
				
			||||||
  "main": "Video.ios.js",
 | 
					  "main": "Video.ios.js",
 | 
				
			||||||
  "author": "Brent Vatne <brentvatne@gmail.com> (https://github.com/brentvatne)",
 | 
					  "author": "Brent Vatne <brentvatne@gmail.com> (https://github.com/brentvatne)",
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user