diff --git a/Libraries/Image/RCTImageCache.h b/Libraries/Image/RCTImageCache.h index 5d7e9a08f..95f85aad9 100644 --- a/Libraries/Image/RCTImageCache.h +++ b/Libraries/Image/RCTImageCache.h @@ -11,5 +11,5 @@ #import "RCTImageLoader.h" -@interface RCTImageCache : NSObject +@interface RCTImageCache : NSObject @end diff --git a/Libraries/Image/RCTImageLoader.h b/Libraries/Image/RCTImageLoader.h index 6c8c66ab3..2dfa9c925 100644 --- a/Libraries/Image/RCTImageLoader.h +++ b/Libraries/Image/RCTImageLoader.h @@ -17,6 +17,26 @@ typedef void (^RCTImageLoaderProgressBlock)(int64_t progress, int64_t total); typedef void (^RCTImageLoaderCompletionBlock)(NSError *error, UIImage *image); typedef dispatch_block_t RCTImageLoaderCancellationBlock; +/** + * Provides an interface to use for providing a image caching strategy. + */ +@protocol RCTImageCache + +- (UIImage *)imageForUrl:(NSString *)url + size:(CGSize)size + scale:(CGFloat)scale + resizeMode:(RCTResizeMode)resizeMode + responseDate:(NSString *)responseDate; + +- (void)addImageToCache:(UIImage *)image + URL:(NSString *)url + size:(CGSize)size + scale:(CGFloat)scale + resizeMode:(RCTResizeMode)resizeMode + responseDate:(NSString *)responseDate; + +@end + @interface UIImage (React) @property (nonatomic, copy) CAKeyframeAnimation *reactKeyframeAnimation; @@ -92,6 +112,13 @@ typedef dispatch_block_t RCTImageLoaderCancellationBlock; - (RCTImageLoaderCancellationBlock)getImageSizeForURLRequest:(NSURLRequest *)imageURLRequest block:(void(^)(NSError *error, CGSize size))completionBlock; +/** + * Allows developers to set their own caching implementation for + * decoded images as long as it conforms to the RCTImageCacheDelegate + * protocol. This method should be called in bridgeDidInitializeModule. + */ +- (void)setImageCache:(id)cache; + @end @interface RCTBridge (RCTImageLoader) @@ -198,24 +225,3 @@ typedef dispatch_block_t RCTImageLoaderCancellationBlock; - (float)decoderPriority; @end - -/** - * Provides an interface to use for providing a image caching strategy. - */ - -@protocol RCTImageCacheDelegate - -- (UIImage *)imageForUrl:(NSString *)url - size:(CGSize)size - scale:(CGFloat)scale - resizeMode:(RCTResizeMode)resizeMode - responseDate:(NSString *)responseDate; - -- (void)addImageToCache:(UIImage *)image - URL:(NSString *)url - size:(CGSize)size - scale:(CGFloat)scale - resizeMode:(RCTResizeMode)resizeMode - responseDate:(NSString *)responseDate; - -@end diff --git a/Libraries/Image/RCTImageLoader.m b/Libraries/Image/RCTImageLoader.m index 2f227129b..2c5bd682e 100644 --- a/Libraries/Image/RCTImageLoader.m +++ b/Libraries/Image/RCTImageLoader.m @@ -43,7 +43,7 @@ NSArray> *_decoders; NSOperationQueue *_imageDecodeQueue; dispatch_queue_t _URLRequestQueue; - id _imageCache; + id _imageCache; NSMutableArray *_pendingTasks; NSInteger _activeTasks; NSMutableArray *_pendingDecodes; @@ -65,20 +65,28 @@ RCT_EXPORT_MODULE() _URLRequestQueue = dispatch_queue_create("com.facebook.react.ImageLoaderURLRequestQueue", DISPATCH_QUEUE_SERIAL); } -- (id)getImageCache -{ - if (!_imageCache) { - //set up with default cache - _imageCache = [RCTImageCache new]; - } - return _imageCache; -} - - (float)handlerPriority { return 1; } +- (id)imageCache +{ + if (!_imageCache) { + //set up with default cache + _imageCache = [RCTImageCache new]; + } + return _imageCache; +} + +- (void)setImageCache:(id)cache +{ + if (_imageCache) { + RCTLogWarn(@"RCTImageCache was already set and has now been overriden."); + } + _imageCache = cache; +} + - (id)imageURLLoaderForURL:(NSURL *)URL { if (!_maxConcurrentLoadingTasks) { @@ -500,7 +508,7 @@ static UIImage *RCTResizeImageIfNeeded(UIImage *image, // Check decoded image cache if (cacheResult) { - UIImage *image = [[strongSelf getImageCache] imageForUrl:imageURLRequest.URL.absoluteString + UIImage *image = [[strongSelf imageCache] imageForUrl:imageURLRequest.URL.absoluteString size:size scale:scale resizeMode:resizeMode @@ -514,7 +522,7 @@ static UIImage *RCTResizeImageIfNeeded(UIImage *image, // Store decoded image in cache RCTImageLoaderCompletionBlock cacheResultHandler = ^(NSError *error_, UIImage *image) { if (image) { - [[strongSelf getImageCache] addImageToCache:image + [[strongSelf imageCache] addImageToCache:image URL:imageURLRequest.URL.absoluteString size:size scale:scale