diff --git a/React/Base/RCTBridgeModule.h b/React/Base/RCTBridgeModule.h index 98b7754ae75..0f82178d63a 100644 --- a/React/Base/RCTBridgeModule.h +++ b/React/Base/RCTBridgeModule.h @@ -360,6 +360,9 @@ RCT_EXTERN_C_END */ - (id)moduleForName:(const char *)moduleName warnOnLookupFailure:(BOOL)warnOnLookupFailure; - (BOOL)moduleIsInitialized:(const char *)moduleName; + +- (NSArray *)eagerInitModuleNames; +- (NSArray *)eagerInitMainQueueModuleNames; @end /** diff --git a/React/CxxBridge/RCTCxxBridge.mm b/React/CxxBridge/RCTCxxBridge.mm index 0d9f380da7c..4922eb65707 100644 --- a/React/CxxBridge/RCTCxxBridge.mm +++ b/React/CxxBridge/RCTCxxBridge.mm @@ -381,6 +381,27 @@ struct RCTInstanceCallback : public InstanceCallback { })); } + /** + * id jsExecutorFactory may create and assign an id object to + * RCTCxxBridge If id is assigned by this time, eagerly initialize all TurboModules + */ + if (_turboModuleLookupDelegate) { + for (NSString *moduleName in [_turboModuleLookupDelegate eagerInitModuleNames]) { + [_turboModuleLookupDelegate moduleForName:[moduleName UTF8String]]; + } + + for (NSString *moduleName in [_turboModuleLookupDelegate eagerInitMainQueueModuleNames]) { + if (RCTIsMainQueue()) { + [_turboModuleLookupDelegate moduleForName:[moduleName UTF8String]]; + } else { + id turboModuleLookupDelegate = _turboModuleLookupDelegate; + dispatch_group_async(prepareBridge, dispatch_get_main_queue(), ^{ + [turboModuleLookupDelegate moduleForName:[moduleName UTF8String]]; + }); + } + } + } + // Dispatch the instance initialization as soon as the initial module metadata has // been collected (see initModules) dispatch_group_enter(prepareBridge); diff --git a/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.h b/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.h index 7edc90ca386..62779de897d 100644 --- a/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.h +++ b/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.h @@ -19,6 +19,9 @@ - (std::shared_ptr)getTurboModule:(const std::string &)name initParams: (const facebook::react::ObjCTurboModule::InitParams &)params; +@optional +- (NSArray *)getEagerInitModuleNames; +- (NSArray *)getEagerInitMainQueueModuleNames; @optional diff --git a/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.mm b/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.mm index ce61d802a7f..218059dfaf8 100644 --- a/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.mm +++ b/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.mm @@ -714,6 +714,24 @@ static Class getFallbackClassFromName(const char *name) return _turboModuleHolders.find(moduleName) != _turboModuleHolders.end(); } +- (NSArray *)eagerInitModuleNames +{ + if ([_delegate respondsToSelector:@selector(getEagerInitModuleNames)]) { + return [_delegate getEagerInitModuleNames]; + } + + return @[]; +} + +- (NSArray *)eagerInitMainQueueModuleNames +{ + if ([_delegate respondsToSelector:@selector(getEagerInitMainQueueModuleNames)]) { + return [_delegate getEagerInitMainQueueModuleNames]; + } + + return @[]; +} + #pragma mark Invalidation logic - (void)bridgeWillInvalidateModules:(NSNotification *)notification