From e8a45c96a7bb4832c3c1340cc695497b6677bafc Mon Sep 17 00:00:00 2001 From: Sokovikov Date: Thu, 5 Jan 2017 21:48:10 -0800 Subject: [PATCH] fix crash on reload during animation Summary: closes #11719 **Test plan (required)** Cmd+r during native animation in uiexplorer Closes https://github.com/facebook/react-native/pull/11720 Differential Revision: D4386449 fbshipit-source-id: a7b5ea2c77de260e8b95b5983438f9cef4d1d752 --- Libraries/NativeAnimation/RCTNativeAnimatedModule.m | 5 +++++ .../NativeAnimation/RCTNativeAnimatedNodesManager.h | 2 ++ .../NativeAnimation/RCTNativeAnimatedNodesManager.m | 9 ++++++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Libraries/NativeAnimation/RCTNativeAnimatedModule.m b/Libraries/NativeAnimation/RCTNativeAnimatedModule.m index 5f7a17303f3..53e67eb7745 100644 --- a/Libraries/NativeAnimation/RCTNativeAnimatedModule.m +++ b/Libraries/NativeAnimation/RCTNativeAnimatedModule.m @@ -20,6 +20,11 @@ typedef void (^AnimatedOperation)(RCTNativeAnimatedNodesManager *nodesManager); RCT_EXPORT_MODULE(); +- (void)invalidate +{ + [_nodesManager stopAnimationLoop]; +} + - (void)dealloc { [self.bridge.eventDispatcher removeDispatchObserver:self]; diff --git a/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.h b/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.h index 25c4bcb8f26..1330aad49de 100644 --- a/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.h +++ b/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.h @@ -60,6 +60,8 @@ - (void)stopAnimation:(nonnull NSNumber *)animationId; +- (void)stopAnimationLoop; + // events - (void)addAnimatedEventToView:(nonnull NSNumber *)viewTag diff --git a/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.m b/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.m index dc6e8337327..c1dc22fabf5 100644 --- a/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.m +++ b/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.m @@ -321,7 +321,14 @@ - (void)stopAnimationLoopIfNeeded { - if (_displayLink && _activeAnimations.count == 0) { + if (_activeAnimations.count == 0) { + [self stopAnimationLoop]; + } +} + +- (void)stopAnimationLoop +{ + if (_displayLink) { [_displayLink invalidate]; _displayLink = nil; }