From 1f394fa673a876753fdc9ac2cb86a4d4a58cd8cd Mon Sep 17 00:00:00 2001 From: Kevin Gozali Date: Wed, 7 Nov 2018 07:31:22 -0800 Subject: [PATCH] iOS: Attempt to load lazy modules when asked from native Summary: Previously, asking for an instance of NativeModule from the native side gave `nil` if the lazy modules have not been loaded, which is not consistent with the access from JS. This at least attempts to force load the lazy modules when asked from native. p.s. one asks for a module by doing `[bridge moduleForClass:[FooBar class]]`. Reviewed By: spredolac Differential Revision: D12931640 fbshipit-source-id: 15d2dc574067d3386ef921512ce4bc837749dabd --- React/Base/RCTBridge.m | 6 +++++- React/CxxBridge/RCTCxxBridge.mm | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/React/Base/RCTBridge.m b/React/Base/RCTBridge.m index 4cf32a6c45e..a8a79a9456c 100644 --- a/React/Base/RCTBridge.m +++ b/React/Base/RCTBridge.m @@ -243,7 +243,11 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init) - (id)moduleForClass:(Class)moduleClass { - return [self moduleForName:RCTBridgeModuleNameForClass(moduleClass)]; + id module = [self.batchedBridge moduleForClass:moduleClass]; + if (!module) { + module = [self moduleForName:RCTBridgeModuleNameForClass(moduleClass)]; + } + return module; } - (NSArray *)modulesConformingToProtocol:(Protocol *)protocol diff --git a/React/CxxBridge/RCTCxxBridge.mm b/React/CxxBridge/RCTCxxBridge.mm index a7d3ab9c9b8..c5bcb308e02 100644 --- a/React/CxxBridge/RCTCxxBridge.mm +++ b/React/CxxBridge/RCTCxxBridge.mm @@ -444,6 +444,21 @@ struct RCTInstanceCallback : public InstanceCallback { return _moduleDataByName[RCTBridgeModuleNameForClass(moduleClass)].hasInstance; } +- (id)moduleForClass:(Class)moduleClass +{ + NSString *moduleName = RCTBridgeModuleNameForClass(moduleClass); + RCTModuleData *moduleData = _moduleDataByName[moduleName]; + if (moduleData) { + return moduleData.instance; + } + + // Module may not be loaded yet, so attempt to force load it here. + RCTAssert([moduleClass conformsToProtocol:@protocol(RCTBridgeModule)], @"Asking for a NativeModule that doesn't conform to RCTBridgeModule: %@", NSStringFromClass(moduleClass)); + [self registerAdditionalModuleClasses:@[moduleClass]]; + + return _moduleDataByName[moduleName].instance; +} + - (std::shared_ptr)_buildModuleRegistryUnlocked { if (!self.valid) {