RCTSurface: Stopping the app on surface object deallocation

Reviewed By: rsnara

Differential Revision: D6431628

fbshipit-source-id: 2b3fd39d77a1108516f00727dd21f648c2bf41b1
This commit is contained in:
Valentin Shergin 2017-12-03 20:03:32 -08:00 коммит произвёл Facebook Github Bot
Родитель 43b2509320
Коммит ba6075120a
3 изменённых файлов: 17 добавлений и 5 удалений

Просмотреть файл

@ -85,7 +85,7 @@
_stage = _stage | RCTSurfaceStageBridgeDidLoad;
}
[self _registerRootViewTag];
[self _registerRootView];
[self _run];
}
@ -94,6 +94,7 @@
- (void)dealloc
{
[self _stop];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
@ -297,7 +298,18 @@
[self _setStage:RCTSurfaceStageSurfaceDidRun];
}
- (void)_registerRootViewTag
- (void)_stop
{
RCTBridge *batchedBridge = self._batchedBridge;
[batchedBridge enqueueJSCall:@"AppRegistry"
method:@"unmountApplicationComponentAtRootTag"
args:@[self->_rootViewTag]
completion:NULL];
[self _setStage:RCTSurfaceStageSurfaceDidStop];
}
- (void)_registerRootView
{
RCTBridge *batchedBridge;
CGSize minimumSize;

Просмотреть файл

@ -22,7 +22,7 @@ typedef NS_OPTIONS(NSInteger, RCTSurfaceStage) {
RCTSurfaceStageSurfaceDidInitialRendering = 1 << 4, // UIManager created the first shadow views
RCTSurfaceStageSurfaceDidInitialLayout = 1 << 5, // UIManager completed the first layout pass
RCTSurfaceStageSurfaceDidInitialMounting = 1 << 6, // UIManager completed the first mounting pass
RCTSurfaceStageSurfaceDidInvalidate = 1 << 7, // Surface received `invalidate` message
RCTSurfaceStageSurfaceDidStop = 1 << 7, // Surface stopped
};
/**

Просмотреть файл

@ -12,11 +12,11 @@
BOOL RCTSurfaceStageIsRunning(RCTSurfaceStage stage) {
return
(stage & RCTSurfaceStageSurfaceDidInitialLayout) &&
!(stage & RCTSurfaceStageSurfaceDidInvalidate);
!(stage & RCTSurfaceStageSurfaceDidStop);
}
BOOL RCTSurfaceStageIsPreparing(RCTSurfaceStage stage) {
return
!(stage & RCTSurfaceStageSurfaceDidInitialLayout) &&
!(stage & RCTSurfaceStageSurfaceDidInvalidate);
!(stage & RCTSurfaceStageSurfaceDidStop);
}