Skip to content

Commit

Permalink
Allow modifying iOS image cache limits (#33554)
Browse files Browse the repository at this point in the history
Summary:
Allow modifying iOS image cache limits. Currently the image cache imposes some strict limits:

[NSCache.totalCostLimit](https://developer.apple.com/documentation/foundation/nscache/1407672-totalcostlimit?language=objc) of 20MB.
Single Image Size Limit of 2MB (bitmap size).

This may not be enough for applications that make heavy use of images. With this commit it is possible to fine tune them to the applications need.

This can be set for example in the App Delegate with:

```objc
RCTSetImageCacheLimits(4*1024*1024, 200*1024*1024);
```
This would increase the single image size limit to 4 MB and the total cost limit to 200 MB.

## Changelog

[iOS] [Added] - Allow modifying iOS image cache limits

Pull Request resolved: #33554

Test Plan: There is no easy way to test this except adding the above snippet and checking via break points that the new limits are used.

Reviewed By: cipolleschi

Differential Revision: D35485914

Pulled By: cortinico

fbshipit-source-id: 646cf7cab5ea5258d0d0d0bce6383317e27e4445
  • Loading branch information
danilobuerger authored and facebook-github-bot committed Apr 8, 2022
1 parent 09b0648 commit 61b013e
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 2 deletions.
3 changes: 3 additions & 0 deletions Libraries/Image/RCTImageCache.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,7 @@
@end

@interface RCTImageCache : NSObject <RCTImageCache>

RCT_EXTERN void RCTSetImageCacheLimits(NSUInteger maxCachableDecodedImageSizeInBytes, NSUInteger imageCacheTotalCostLimit);

@end
10 changes: 8 additions & 2 deletions Libraries/Image/RCTImageCache.m
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,13 @@

#import <React/RCTImageUtils.h>

static const NSUInteger RCTMaxCachableDecodedImageSizeInBytes = 2097152; // 2 MB
static NSUInteger RCTMaxCachableDecodedImageSizeInBytes = 2*1024*1024;
static NSUInteger RCTImageCacheTotalCostLimit = 20*1024*1024;

void RCTSetImageCacheLimits(NSUInteger maxCachableDecodedImageSizeInBytes, NSUInteger imageCacheTotalCostLimit) {
RCTMaxCachableDecodedImageSizeInBytes = maxCachableDecodedImageSizeInBytes;
RCTImageCacheTotalCostLimit = imageCacheTotalCostLimit;
}

static NSString *RCTCacheKeyForImage(NSString *imageTag, CGSize size, CGFloat scale,
RCTResizeMode resizeMode)
Expand All @@ -38,7 +44,7 @@ - (instancetype)init
{
if (self = [super init]) {
_decodedImageCache = [NSCache new];
_decodedImageCache.totalCostLimit = 20 * 1024 * 1024; // 20 MB
_decodedImageCache.totalCostLimit = RCTImageCacheTotalCostLimit;
_cacheStaleTimes = [NSMutableDictionary new];

[[NSNotificationCenter defaultCenter] addObserver:self
Expand Down

0 comments on commit 61b013e

Please sign in to comment.