Make RCTLocalAssetImageLoader and RCTGIFImageDecoder TurboModule-compatible

Summary:
Couldn't make RCTImageEditingManager and RCTImageStoreManager TurboModule-compatible because their specs live in fb-internal code. I will tackle them in a subsequent diff. See T54946472.

Changelog: [iOS][Added] Make RCTLocalAssetImageLoader and RCTGIFImageDecoder TurboModule-compatible

Reviewed By: PeteTheHeat

Differential Revision: D17936483

fbshipit-source-id: 2266c9ea1ca7ecd52717d9a963e39245da312312
This commit is contained in:
Ramanpreet Nara 2019-10-21 16:57:38 -07:00 коммит произвёл Facebook Github Bot
Родитель d8fda74c24
Коммит c8701b6b36
6 изменённых файлов: 54 добавлений и 16 удалений

Просмотреть файл

@ -9,9 +9,14 @@
#import <ImageIO/ImageIO.h>
#import <QuartzCore/QuartzCore.h>
#import <React/RCTUtils.h>
#import <React/RCTAnimatedImage.h>
#import <React/RCTUtils.h>
#import <ReactCommon/RCTTurboModule.h>
#import "RCTImagePlugins.h"
@interface RCTGIFImageDecoder() <RCTTurboModule>
@end
@implementation RCTGIFImageDecoder
@ -32,14 +37,18 @@ RCT_EXPORT_MODULE()
completionHandler:(RCTImageLoaderCompletionBlock)completionHandler
{
RCTAnimatedImage *image = [[RCTAnimatedImage alloc] initWithData:imageData scale:scale];
if (!image) {
completionHandler(nil, nil);
return ^{};
}
completionHandler(nil, image);
return ^{};
}
@end
Class RCTGIFImageDecoderCls() {
return RCTGIFImageDecoder.class;
}

Просмотреть файл

@ -7,8 +7,6 @@
#import <React/RCTImageEditingManager.h>
#import <UIKit/UIKit.h>
#import <React/RCTConvert.h>
#import <React/RCTImageLoader.h>
#import <React/RCTImageStoreManager.h>
@ -16,6 +14,9 @@
#import <React/RCTImageLoaderProtocol.h>
#import <React/RCTLog.h>
#import <React/RCTUtils.h>
#import <UIKit/UIKit.h>
#import "RCTImagePlugins.h"
@implementation RCTImageEditingManager
@ -79,3 +80,7 @@ RCT_EXPORT_METHOD(cropImage:(NSURLRequest *)imageRequest
}
@end
Class RCTImageEditingManagerCls() {
return RCTImageEditingManager.class;
}

Просмотреть файл

@ -29,7 +29,11 @@ extern "C" {
Class RCTImageClassProvider(const char *name);
// Lookup functions
Class RCTGIFImageDecoderCls(void) __attribute__((used));
Class RCTImageEditingManagerCls(void) __attribute__((used));
Class RCTImageLoaderCls(void) __attribute__((used));
Class RCTImageStoreManagerCls(void) __attribute__((used));
Class RCTLocalAssetImageLoaderCls(void) __attribute__((used));
#ifdef __cplusplus
}

Просмотреть файл

@ -18,7 +18,11 @@
Class RCTImageClassProvider(const char *name) {
static std::unordered_map<std::string, Class (*)(void)> sCoreModuleClassMap = {
{"GIFImageDecoder", RCTGIFImageDecoderCls},
{"ImageEditingManager", RCTImageEditingManagerCls},
{"ImageLoader", RCTImageLoaderCls},
{"ImageStoreManager", RCTImageStoreManagerCls},
{"LocalAssetImageLoader", RCTLocalAssetImageLoaderCls},
};
auto p = sCoreModuleClassMap.find(name);

Просмотреть файл

@ -7,17 +7,18 @@
#import <React/RCTImageStoreManager.h>
#import <stdatomic.h>
#import <atomic>
#import <memory>
#import <ImageIO/ImageIO.h>
#import <MobileCoreServices/UTType.h>
#import <React/RCTAssert.h>
#import <React/RCTLog.h>
#import <React/RCTUtils.h>
#import <React/RCTImageUtils.h>
#import "RCTImagePlugins.h"
static NSString *const RCTImageStoreURLScheme = @"rct-image-store";
@implementation RCTImageStoreManager
@ -140,14 +141,14 @@ RCT_EXPORT_METHOD(addImageFromBase64:(NSString *)base64String
- (id)sendRequest:(NSURLRequest *)request withDelegate:(id<RCTURLRequestDelegate>)delegate
{
__block atomic_bool cancelled = ATOMIC_VAR_INIT(NO);
__block auto cancelled = std::make_shared<std::atomic<bool>>(false);
void (^cancellationBlock)(void) = ^{
atomic_store(&cancelled, YES);
cancelled->store(true);
};
// Dispatch async to give caller time to cancel the request
dispatch_async(_methodQueue, ^{
if (atomic_load(&cancelled)) {
if (cancelled->load()) {
return;
}
@ -238,3 +239,7 @@ RCT_EXPORT_METHOD(addImageFromBase64:(NSString *)base64String
}
@end
Class RCTImageStoreManagerCls(void) {
return RCTImageStoreManager.class;
}

Просмотреть файл

@ -7,9 +7,16 @@
#import <React/RCTLocalAssetImageLoader.h>
#import <stdatomic.h>
#import <atomic>
#import <memory>
#import <React/RCTUtils.h>
#import <ReactCommon/RCTTurboModule.h>
#import "RCTImagePlugins.h"
@interface RCTLocalAssetImageLoader() <RCTTurboModule>
@end
@implementation RCTLocalAssetImageLoader
@ -42,9 +49,9 @@ RCT_EXPORT_MODULE()
partialLoadHandler:(RCTImageLoaderPartialLoadBlock)partialLoadHandler
completionHandler:(RCTImageLoaderCompletionBlock)completionHandler
{
__block atomic_bool cancelled = ATOMIC_VAR_INIT(NO);
__block auto cancelled = std::make_shared<std::atomic<bool>>(false);
RCTExecuteOnMainQueue(^{
if (atomic_load(&cancelled)) {
if (cancelled->load()) {
return;
}
@ -62,8 +69,12 @@ RCT_EXPORT_MODULE()
});
return ^{
atomic_store(&cancelled, YES);
cancelled->store(true);
};
}
@end
Class RCTLocalAssetImageLoaderCls(void) {
return RCTLocalAssetImageLoader.class;
}