Skip to content

Commit d7a0c44

Browse files
fkgozalifacebook-github-bot
authored andcommitted
iOS: add moduleForNameForcedLoad: to lookup modules by name and force load them
Summary: Some module classes may not be loaded yet, so looking up via classes may not always give the correct instance. This diff added a new lookup method that delegate to the bridge delegate to force load the modules as needed. The existing moduleForName: method was left untouched because it's solely used by RCTUIManager at the moment. Reviewed By: dshahidehpour Differential Revision: D13033876 fbshipit-source-id: 4082fcd68498004f678b4b95adc82b5b134fefdf
1 parent 8826d8b commit d7a0c44

File tree

3 files changed

+32
-9
lines changed

3 files changed

+32
-9
lines changed

React/Base/RCTBridge.h

+4
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,12 @@ RCT_EXTERN void RCTEnableJSINativeModule(BOOL enabled);
151151
* lazily instantiated, so calling these methods for the first time with a given
152152
* module name/class may cause the class to be sychronously instantiated,
153153
* potentially blocking both the calling thread and main thread for a short time.
154+
*
155+
* Note: This method does NOT lazily load the particular module if it's not yet loaded.
154156
*/
155157
- (id)moduleForName:(NSString *)moduleName;
158+
- (id)moduleForName:(NSString *)moduleName lazilyLoadIfNecessary:(BOOL)lazilyLoad;
159+
// Note: This method lazily load the module as necessary.
156160
- (id)moduleForClass:(Class)moduleClass;
157161

158162
/**

React/Base/RCTBridge.m

+5
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,11 @@ - (id)moduleForName:(NSString *)moduleName
241241
return [self.batchedBridge moduleForName:moduleName];
242242
}
243243

244+
- (id)moduleForName:(NSString *)moduleName lazilyLoadIfNecessary:(BOOL)lazilyLoad
245+
{
246+
return [self.batchedBridge moduleForName:moduleName lazilyLoadIfNecessary:lazilyLoad];
247+
}
248+
244249
- (id)moduleForClass:(Class)moduleClass
245250
{
246251
id module = [self.batchedBridge moduleForClass:moduleClass];

React/CxxBridge/RCTCxxBridge.mm

+23-9
Original file line numberDiff line numberDiff line change
@@ -439,24 +439,38 @@ - (id)moduleForName:(NSString *)moduleName
439439
return _moduleDataByName[moduleName].instance;
440440
}
441441

442-
- (BOOL)moduleIsInitialized:(Class)moduleClass
442+
- (id)moduleForName:(NSString *)moduleName lazilyLoadIfNecessary:(BOOL)lazilyLoad
443443
{
444-
return _moduleDataByName[RCTBridgeModuleNameForClass(moduleClass)].hasInstance;
445-
}
444+
if (!lazilyLoad) {
445+
return [self moduleForName:moduleName];
446+
}
446447

447-
- (id)moduleForClass:(Class)moduleClass
448-
{
449-
NSString *moduleName = RCTBridgeModuleNameForClass(moduleClass);
450448
RCTModuleData *moduleData = _moduleDataByName[moduleName];
451449
if (moduleData) {
452450
return moduleData.instance;
453451
}
454452

455453
// Module may not be loaded yet, so attempt to force load it here.
456-
RCTAssert([moduleClass conformsToProtocol:@protocol(RCTBridgeModule)], @"Asking for a NativeModule that doesn't conform to RCTBridgeModule: %@", NSStringFromClass(moduleClass));
457-
[self registerAdditionalModuleClasses:@[moduleClass]];
454+
const BOOL result = [self.delegate respondsToSelector:@selector(bridge:didNotFindModule:)] &&
455+
[self.delegate bridge:self didNotFindModule:moduleName];
456+
if (result) {
457+
// Try again.
458+
moduleData = _moduleDataByName[moduleName];
459+
} else {
460+
RCTLogError(@"Unable to find module for %@", moduleName);
461+
}
458462

459-
return _moduleDataByName[moduleName].instance;
463+
return moduleData.instance;
464+
}
465+
466+
- (BOOL)moduleIsInitialized:(Class)moduleClass
467+
{
468+
return _moduleDataByName[RCTBridgeModuleNameForClass(moduleClass)].hasInstance;
469+
}
470+
471+
- (id)moduleForClass:(Class)moduleClass
472+
{
473+
return [self moduleForName:RCTBridgeModuleNameForClass(moduleClass) lazilyLoadIfNecessary:YES];
460474
}
461475

462476
- (std::shared_ptr<ModuleRegistry>)_buildModuleRegistryUnlocked

0 commit comments

Comments
 (0)