From 08961c1e97b984fb3e58a92cbb34bb0e96722975 Mon Sep 17 00:00:00 2001 From: Valentin Shergin Date: Wed, 26 Sep 2018 10:01:56 -0700 Subject: [PATCH] Fabric: Lazy ContextContainer creation in RCTSurfacePresenter Summary: Besides that it's more simple and straight-forward now, we need that to always instantiate Scheduler with a context full of fresh valid objects derived from the new instance of the bridge. Reviewed By: mdvacca Differential Revision: D9995780 fbshipit-source-id: 534a314152d93562b08dd7857962f174b0d06886 --- React/Fabric/RCTSurfacePresenter.h | 9 +++-- React/Fabric/RCTSurfacePresenter.mm | 63 ++++++++++------------------- 2 files changed, 27 insertions(+), 45 deletions(-) diff --git a/React/Fabric/RCTSurfacePresenter.h b/React/Fabric/RCTSurfacePresenter.h index 746af8a2810..9e19318359d 100644 --- a/React/Fabric/RCTSurfacePresenter.h +++ b/React/Fabric/RCTSurfacePresenter.h @@ -27,6 +27,12 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initWithBridge:(RCTBridge *)bridge; +/* + * Deprecated. Do not use. + */ +@property (nonatomic) std::function uiManagerInstaller; +@property (nonatomic) std::function uiManagerUninstaller; + @end @interface RCTSurfacePresenter (Surface) @@ -60,9 +66,6 @@ NS_ASSUME_NONNULL_BEGIN @interface RCTSurfacePresenter (Deprecated) -@property (nonatomic) std::function uiManagerInstaller; -@property (nonatomic) std::function uiManagerUninstaller; - /** * We need to expose `uiManager` for registration * purposes. Eventually, we will move this down to C++ side. diff --git a/React/Fabric/RCTSurfacePresenter.mm b/React/Fabric/RCTSurfacePresenter.mm index e164998f39c..977cfbbae67 100644 --- a/React/Fabric/RCTSurfacePresenter.mm +++ b/React/Fabric/RCTSurfacePresenter.mm @@ -43,7 +43,6 @@ using namespace facebook::react; RCTBridge *_bridge; RCTBridge *_batchedBridge; RCTSurfaceRegistry *_surfaceRegistry; - SharedContextContainer _contextContainer; } - (instancetype)initWithBridge:(RCTBridge *)bridge @@ -52,26 +51,6 @@ using namespace facebook::react; _bridge = bridge; _batchedBridge = [_bridge batchedBridge] ?: _bridge; - auto contextContainer = std::make_shared(); - - auto messageQueueThread = _batchedBridge.jsMessageThread; - - EventBeatFactory synchronousBeatFactory = [messageQueueThread]() { - return std::make_unique(messageQueueThread); - }; - - EventBeatFactory asynchronousBeatFactory = [messageQueueThread]() { - return std::make_unique(messageQueueThread); - }; - - contextContainer->registerInstance(synchronousBeatFactory, "synchronous"); - contextContainer->registerInstance(asynchronousBeatFactory, "asynchronous"); - - void *imageLoader = (__bridge void *)[[RCTBridge currentBridge] imageLoader]; - contextContainer->registerInstance(std::make_shared(imageLoader)); - - _contextContainer = contextContainer; - _surfaceRegistry = [[RCTSurfaceRegistry alloc] init]; _mountingManager = [[RCTMountingManager alloc] init]; @@ -101,7 +80,27 @@ using namespace facebook::react; return; } - _scheduler = [[RCTScheduler alloc] initWithContextContainer:_contextContainer]; + auto contextContainer = std::make_shared(); + + auto messageQueueThread = _batchedBridge.jsMessageThread; + + EventBeatFactory synchronousBeatFactory = [messageQueueThread]() { + return std::make_unique(messageQueueThread); + }; + + EventBeatFactory asynchronousBeatFactory = [messageQueueThread]() { + return std::make_unique(messageQueueThread); + }; + + contextContainer->registerInstance(synchronousBeatFactory, "synchronous"); + contextContainer->registerInstance(asynchronousBeatFactory, "asynchronous"); + + contextContainer->registerInstance(_uiManagerInstaller, "uimanager-installer"); + contextContainer->registerInstance(_uiManagerUninstaller, "uimanager-uninstaller"); + + contextContainer->registerInstance(std::make_shared((__bridge void *)[_bridge imageLoader])); + + _scheduler = [[RCTScheduler alloc] initWithContextContainer:contextContainer]; _scheduler.delegate = self; } @@ -294,26 +293,6 @@ using namespace facebook::react; return _bridge; } -- (void)setUiManagerInstaller:(std::function)uiManagerInstaller -{ - _contextContainer->registerInstance(uiManagerInstaller, "uimanager-installer"); -} - -- (std::function)uiManagerInstaller -{ - return _contextContainer->getInstance>("uimanager-installer"); -} - -- (void)setUiManagerUninstaller:(std::function)uiManagerUninstaller -{ - _contextContainer->registerInstance(uiManagerUninstaller, "uimanager-uninstaller"); -} - -- (std::function)uiManagerUninstaller -{ - return _contextContainer->getInstance>("uimanager-uninstaller"); -} - @end @implementation RCTBridge (RCTSurfacePresenter)