Skip to content

Commit af6bcfa

Browse files
RSNarafacebook-github-bot
authored andcommitted
RCTImageLoader: Use RCTModuleRegistry to load loaders/decoders
Summary: ## Context A React Native application can configure its RCTImageLoader by initializing it with two different sets of objects: - id<RCTImageURLLoader> - id<RCTImageDataDecoder> Therefore, RCTImageLoader supports this initializer: ``` - (instancetype)initWithRedirectDelegate:(id<RCTImageRedirectProtocol>)redirectDelegate loadersProvider:(NSArray<id<RCTImageURLLoader>> * (^)(void))getLoaders decodersProvider:(NSArray<id<RCTImageDataDecoder>> * (^)(void))getHandlers ``` Right now, both the id<RCTImageURLLoader>s and id<RCTImageDataDecoder>s are NativeModules. So, they need to be loaded using the Bridge/TurboModuleManager. ## Problem The method [that constructs RCTImageLoader](https://www.internalfb.com/code/fbsource/[6530647879a5e6d5edcfad029b39879c87e97bb3]/fbobjc/Apps/Wilde/FBReactModule2/FBReactModuleAPI/FBReactModuleAPI/FBReactModule.mm?lines=1462-1469) is shared between bridge mode and bridgeless mode. So, the shared constructor needs to know what infra to use to load the loaders/decoders: the TurboModuleManager, when called from a bridgeless context; the bridge, when called from a bridge context. There's no easy way to let this shared constructor know what context it's being called from. We could fork the constructor, but that's not very clean. ## Changes In this refactor, RCTImageLoader gives its loadersProvider and decodersProvider its RCTModuleRegistry. If the module was instantiated in bridgeless mode, RCTModuleRegistry will use the TurboModuleManager. If the module was instantiated in bridge mode, RCTModuleRegistry will use the bridge. Using RCTModuleRegistry allows these two blocks to load the RCTImageURLLoaders and RCTImageDataDecoder from correct infra, in both contexts. Changelog: [iOS][Changed] - Give RCTImageURLLoader's loader/decoder provider blocks RCTModuleRegistry Reviewed By: PeteTheHeat Differential Revision: D28012999 fbshipit-source-id: 09c787923b57bbf72aff95b504f88ee1f2f44283
1 parent d6cd2e6 commit af6bcfa

File tree

3 files changed

+10
-10
lines changed

3 files changed

+10
-10
lines changed

Libraries/Image/RCTImageLoader.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
- (instancetype)init;
2222
- (instancetype)initWithRedirectDelegate:(id<RCTImageRedirectProtocol>)redirectDelegate NS_DESIGNATED_INITIALIZER;
2323
- (instancetype)initWithRedirectDelegate:(id<RCTImageRedirectProtocol>)redirectDelegate
24-
loadersProvider:(NSArray<id<RCTImageURLLoader>> * (^)(void))getLoaders
25-
decodersProvider:(NSArray<id<RCTImageDataDecoder>> * (^)(void))getDecoders;
24+
loadersProvider:(NSArray<id<RCTImageURLLoader>> * (^)(RCTModuleRegistry *))getLoaders
25+
decodersProvider:(NSArray<id<RCTImageDataDecoder>> * (^)(RCTModuleRegistry *))getDecoders;
2626
@end
2727

2828
/**

Libraries/Image/RCTImageLoader.mm

+6-6
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ - (void)setReactDecodedImageBytes:(NSInteger)bytes
8080

8181
@implementation RCTImageLoader
8282
{
83-
NSArray<id<RCTImageURLLoader>> * (^_loadersProvider)(void);
84-
NSArray<id<RCTImageDataDecoder>> * (^_decodersProvider)(void);
83+
NSArray<id<RCTImageURLLoader>> * (^_loadersProvider)(RCTModuleRegistry *);
84+
NSArray<id<RCTImageDataDecoder>> * (^_decodersProvider)(RCTModuleRegistry *);
8585
NSArray<id<RCTImageURLLoader>> *_loaders;
8686
NSArray<id<RCTImageDataDecoder>> *_decoders;
8787
NSOperationQueue *_imageDecodeQueue;
@@ -123,8 +123,8 @@ - (instancetype)initWithRedirectDelegate:(id<RCTImageRedirectProtocol>)redirectD
123123
}
124124

125125
- (instancetype)initWithRedirectDelegate:(id<RCTImageRedirectProtocol>)redirectDelegate
126-
loadersProvider:(NSArray<id<RCTImageURLLoader>> * (^)(void))getLoaders
127-
decodersProvider:(NSArray<id<RCTImageDataDecoder>> * (^)(void))getHandlers
126+
loadersProvider:(NSArray<id<RCTImageURLLoader>> * (^)(RCTModuleRegistry *))getLoaders
127+
decodersProvider:(NSArray<id<RCTImageDataDecoder>> * (^)(RCTModuleRegistry *))getHandlers
128128
{
129129
if (self = [self initWithRedirectDelegate:redirectDelegate]) {
130130
_loadersProvider = getLoaders;
@@ -178,7 +178,7 @@ - (void)setImageCache:(id<RCTImageCache>)cache
178178

179179
// Get loaders, sorted in reverse priority order (highest priority first)
180180
if (_loadersProvider) {
181-
_loaders = _loadersProvider();
181+
_loaders = _loadersProvider(self.moduleRegistry);
182182
} else {
183183
RCTAssert(_bridge, @"Trying to find RCTImageURLLoaders and bridge not set.");
184184
_loaders = [_bridge modulesConformingToProtocol:@protocol(RCTImageURLLoader)];
@@ -245,7 +245,7 @@ - (void)setImageCache:(id<RCTImageCache>)cache
245245
// Get decoders, sorted in reverse priority order (highest priority first)
246246

247247
if (_decodersProvider) {
248-
_decoders = _decodersProvider();
248+
_decoders = _decodersProvider(self.moduleRegistry);
249249
} else {
250250
RCTAssert(_bridge, @"Trying to find RCTImageDataDecoders and bridge not set.");
251251
_decoders = [_bridge modulesConformingToProtocol:@protocol(RCTImageDataDecoder)];

packages/rn-tester/RNTester/AppDelegate.mm

+2-2
Original file line numberDiff line numberDiff line change
@@ -208,10 +208,10 @@ - (Class)getModuleClassFromName:(const char *)name
208208
{
209209
if (moduleClass == RCTImageLoader.class) {
210210
return [[moduleClass alloc] initWithRedirectDelegate:nil
211-
loadersProvider:^NSArray<id<RCTImageURLLoader>> * {
211+
loadersProvider:^NSArray<id<RCTImageURLLoader>> *(RCTModuleRegistry * moduleRegistry) {
212212
return @ [[RCTLocalAssetImageLoader new]];
213213
}
214-
decodersProvider:^NSArray<id<RCTImageDataDecoder>> * {
214+
decodersProvider:^NSArray<id<RCTImageDataDecoder>> *(RCTModuleRegistry * moduleRegistry) {
215215
return @ [[RCTGIFImageDecoder new]];
216216
}];
217217
} else if (moduleClass == RCTNetworking.class) {

0 commit comments

Comments
 (0)