Skip to content

Commit f88bc3e

Browse files
committed
[ReactNative] Refactor RCTDataManager to support pluggable data source modules (RCTURLRequestHandlers)
Summary: @public This is a refactor of @philikon's original diff that decouples the dependencies between the Network and Image modules, and replaces RCTDataQueryExecutor with a more useful abstraction. I've introduced the RCTURLRequestHandler protocol, which is a new type of bridge module used for loading data using an NSURLRequest. RCTURLRequestHandlers can be registered using RCT_EXPORT_MODULE() and are then available at runtime for use by the RCTDataManager, which will automatically select the appropriate handler for a given request based on the handler's self-reported capabilities. The currently implemented handlers are: - RCTHTTPRequestHandler - the standard open source HTTP request handler that uses NSURLSession - RKHTTPRequestHandler - the internal FB HTTP request handler that uses FBNetworking - RCTImageRequestHandler - a handler for loading local images from the iOS asset-library Depends on D2108193 Test Plan: - Internal apps still work - OSS port still compiles, Movies app and a sample Parse app still work - uploading image to Parse using the above code snippet works - tested `FormData` with string and image parameters using http://www.posttestserver.com/
1 parent f4bf80f commit f88bc3e

19 files changed

+751
-421
lines changed

Libraries/Image/RCTImage.xcodeproj/project.pbxproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
1304D5AB1AA8C4A30002E2BE /* RCTStaticImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 1304D5A81AA8C4A30002E2BE /* RCTStaticImage.m */; };
1111
1304D5AC1AA8C4A30002E2BE /* RCTStaticImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1304D5AA1AA8C4A30002E2BE /* RCTStaticImageManager.m */; };
1212
1304D5B21AA8C50D0002E2BE /* RCTGIFImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 1304D5B11AA8C50D0002E2BE /* RCTGIFImage.m */; };
13+
1345A8391B26592900583190 /* RCTImageRequestHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 1345A8381B26592900583190 /* RCTImageRequestHandler.m */; };
1314
143879351AAD238D00F088A5 /* RCTCameraRollManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 143879341AAD238D00F088A5 /* RCTCameraRollManager.m */; };
1415
143879381AAD32A300F088A5 /* RCTImageLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = 143879371AAD32A300F088A5 /* RCTImageLoader.m */; };
1516
58B5118F1A9E6BD600147676 /* RCTImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 58B5118A1A9E6BD600147676 /* RCTImageDownloader.m */; };
@@ -36,6 +37,8 @@
3637
1304D5AA1AA8C4A30002E2BE /* RCTStaticImageManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTStaticImageManager.m; sourceTree = "<group>"; };
3738
1304D5B01AA8C50D0002E2BE /* RCTGIFImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTGIFImage.h; sourceTree = "<group>"; };
3839
1304D5B11AA8C50D0002E2BE /* RCTGIFImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTGIFImage.m; sourceTree = "<group>"; };
40+
1345A8371B26592900583190 /* RCTImageRequestHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTImageRequestHandler.h; sourceTree = "<group>"; };
41+
1345A8381B26592900583190 /* RCTImageRequestHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTImageRequestHandler.m; sourceTree = "<group>"; };
3942
143879331AAD238D00F088A5 /* RCTCameraRollManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTCameraRollManager.h; sourceTree = "<group>"; };
4043
143879341AAD238D00F088A5 /* RCTCameraRollManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTCameraRollManager.m; sourceTree = "<group>"; };
4144
143879361AAD32A300F088A5 /* RCTImageLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTImageLoader.h; sourceTree = "<group>"; };
@@ -71,6 +74,8 @@
7174
1304D5B11AA8C50D0002E2BE /* RCTGIFImage.m */,
7275
58B511891A9E6BD600147676 /* RCTImageDownloader.h */,
7376
58B5118A1A9E6BD600147676 /* RCTImageDownloader.m */,
77+
1345A8371B26592900583190 /* RCTImageRequestHandler.h */,
78+
1345A8381B26592900583190 /* RCTImageRequestHandler.m */,
7479
58B5118B1A9E6BD600147676 /* RCTNetworkImageView.h */,
7580
58B5118C1A9E6BD600147676 /* RCTNetworkImageView.m */,
7681
58B5118D1A9E6BD600147676 /* RCTNetworkImageViewManager.h */,
@@ -152,6 +157,7 @@
152157
58B5118F1A9E6BD600147676 /* RCTImageDownloader.m in Sources */,
153158
58B511911A9E6BD600147676 /* RCTNetworkImageViewManager.m in Sources */,
154159
1304D5AC1AA8C4A30002E2BE /* RCTStaticImageManager.m in Sources */,
160+
1345A8391B26592900583190 /* RCTImageRequestHandler.m in Sources */,
155161
58B511901A9E6BD600147676 /* RCTNetworkImageView.m in Sources */,
156162
1304D5B21AA8C50D0002E2BE /* RCTGIFImage.m in Sources */,
157163
143879351AAD238D00F088A5 /* RCTCameraRollManager.m in Sources */,

Libraries/Image/RCTImageLoader.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,4 @@
2323
+ (void)loadImageWithTag:(NSString *)tag
2424
callback:(void (^)(NSError *error, id /* UIImage or CAAnimation */ image))callback;
2525

26-
+ (BOOL)isSystemImageURI:(NSString *)uri;
27-
2826
@end

Libraries/Image/RCTImageLoader.m

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,23 @@
1616
#import <UIKit/UIKit.h>
1717

1818
#import "RCTConvert.h"
19+
#import "RCTDefines.h"
1920
#import "RCTGIFImage.h"
2021
#import "RCTImageDownloader.h"
2122
#import "RCTLog.h"
2223
#import "RCTUtils.h"
2324

25+
static void RCTDispatchCallbackOnMainQueue(void (^ __nonnull callback)(NSError *, id), NSError *error, UIImage *image)
26+
{
27+
if ([NSThread isMainThread]) {
28+
callback(error, image);
29+
} else {
30+
dispatch_async(dispatch_get_main_queue(), ^{
31+
callback(error, image);
32+
});
33+
}
34+
}
35+
2436
static dispatch_queue_t RCTImageLoaderQueue(void)
2537
{
2638
static dispatch_queue_t queue = NULL;
@@ -137,11 +149,4 @@ + (void)loadImageWithTag:(NSString *)imageTag callback:(void (^)(NSError *error,
137149
}
138150
}
139151

140-
+ (BOOL)isSystemImageURI:(NSString *)uri
141-
{
142-
return uri != nil && (
143-
[uri hasPrefix:@"assets-library"] ||
144-
[uri hasPrefix:@"ph://"]);
145-
}
146-
147152
@end
Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,8 @@
77
* of patent rights can be found in the PATENTS file in the same directory.
88
*/
99

10-
#import "RCTBridgeModule.h"
10+
#import "RCTURLRequestHandler.h"
1111

12-
@protocol RCTDataQueryExecutor <NSObject>
13-
14-
- (void)addQuery:(NSDictionary *)query responseSender:(RCTResponseSenderBlock)responseSender;
15-
16-
@optional
17-
18-
@property (nonatomic, weak) RCTBridge *bridge;
19-
@property (nonatomic, assign) BOOL sendIncrementalUpdates;
12+
@interface RCTImageRequestHandler : NSObject <RCTURLRequestHandler>
2013

2114
@end
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
//
2+
// RCTImageRequestHandler.m
3+
// RCTImage
4+
//
5+
// Created by Nick Lockwood on 09/06/2015.
6+
// Copyright (c) 2015 Facebook. All rights reserved.
7+
//
8+
9+
#import "RCTImageRequestHandler.h"
10+
11+
#import <UIKit/UIKit.h>
12+
13+
#import "RCTImageLoader.h"
14+
#import "RCTUtils.h"
15+
16+
@implementation RCTImageRequestHandler
17+
{
18+
NSInteger _currentToken;
19+
}
20+
21+
RCT_EXPORT_MODULE()
22+
23+
- (BOOL)canHandleRequest:(NSURLRequest *)request
24+
{
25+
return [@[@"assets-library", @"ph"] containsObject:[request.URL.scheme lowercaseString]];
26+
}
27+
28+
- (id)sendRequest:(NSURLRequest *)request
29+
withDelegate:(id<RCTURLRequestDelegate>)delegate
30+
{
31+
NSNumber *requestToken = @(++_currentToken);
32+
NSString *URLString = [request.URL absoluteString];
33+
[RCTImageLoader loadImageWithTag:URLString callback:^(NSError *error, UIImage *image) {
34+
if (error) {
35+
[delegate URLRequest:requestToken didCompleteWithError:error];
36+
return;
37+
}
38+
39+
NSString *mimeType = nil;
40+
NSData *imageData = nil;
41+
if (RCTImageHasAlpha(image.CGImage)) {
42+
mimeType = @"image/png";
43+
imageData = UIImagePNGRepresentation(image);
44+
} else {
45+
mimeType = @"image/jpeg";
46+
imageData = UIImageJPEGRepresentation(image, 1.0);
47+
}
48+
49+
NSURLResponse *response = [[NSURLResponse alloc] initWithURL:request.URL
50+
MIMEType:mimeType
51+
expectedContentLength:imageData.length
52+
textEncodingName:nil];
53+
54+
[delegate URLRequest:requestToken didReceiveResponse:response];
55+
[delegate URLRequest:requestToken didReceiveData:imageData];
56+
[delegate URLRequest:requestToken didCompleteWithError:nil];
57+
}];
58+
59+
return requestToken;
60+
}
61+
62+
@end

0 commit comments

Comments
 (0)