mirror of
https://github.com/status-im/react-native.git
synced 2025-01-16 04:24:15 +00:00
344c205070
Summary: Thank you for sending the PR! We appreciate you spending the time to work on these changes. Help us understand your motivation by explaining why you decided to make this change. To fix issue that crash on XCode 9.3 Archive the project in XCode 9.3 This does not change any documentation To fix issue that crash on XCode 9.3 [IOS] [BREAKING] [RCTImageCache.m] - Crash during archiving in XCode 9.3 Closes https://github.com/facebook/react-native/pull/18682 Differential Revision: D7992071 Pulled By: hramos fbshipit-source-id: 1089e469712b1eb2fcdd3ad59766c187e932f46c
99 lines
2.9 KiB
Objective-C
99 lines
2.9 KiB
Objective-C
/**
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#import "RCTImageCache.h"
|
|
|
|
#import <objc/runtime.h>
|
|
|
|
#import <ImageIO/ImageIO.h>
|
|
|
|
#import <React/RCTConvert.h>
|
|
#import <React/RCTNetworking.h>
|
|
#import <React/RCTUtils.h>
|
|
#import <React/RCTResizeMode.h>
|
|
|
|
#import "RCTImageUtils.h"
|
|
|
|
static const NSUInteger RCTMaxCachableDecodedImageSizeInBytes = 1048576; // 1MB
|
|
|
|
static NSString *RCTCacheKeyForImage(NSString *imageTag, CGSize size, CGFloat scale,
|
|
RCTResizeMode resizeMode, NSString *responseDate)
|
|
{
|
|
return [NSString stringWithFormat:@"%@|%g|%g|%g|%lld|%@",
|
|
imageTag, size.width, size.height, scale, (long long)resizeMode, responseDate];
|
|
}
|
|
|
|
@implementation RCTImageCache
|
|
{
|
|
NSOperationQueue *_imageDecodeQueue;
|
|
NSCache *_decodedImageCache;
|
|
}
|
|
|
|
- (instancetype)init
|
|
{
|
|
_decodedImageCache = [NSCache new];
|
|
_decodedImageCache.totalCostLimit = 5 * 1024 * 1024; // 5MB
|
|
|
|
[[NSNotificationCenter defaultCenter] addObserver:self
|
|
selector:@selector(clearCache)
|
|
name:UIApplicationDidReceiveMemoryWarningNotification
|
|
object:nil];
|
|
[[NSNotificationCenter defaultCenter] addObserver:self
|
|
selector:@selector(clearCache)
|
|
name:UIApplicationWillResignActiveNotification
|
|
object:nil];
|
|
|
|
return self;
|
|
}
|
|
|
|
- (void)dealloc
|
|
{
|
|
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
|
}
|
|
|
|
- (void)clearCache
|
|
{
|
|
[_decodedImageCache removeAllObjects];
|
|
}
|
|
|
|
- (void)addImageToCache:(UIImage *)image
|
|
forKey:(NSString *)cacheKey
|
|
{
|
|
if (!image) {
|
|
return;
|
|
}
|
|
CGFloat bytes = image.size.width * image.size.height * image.scale * image.scale * 4;
|
|
if (bytes <= RCTMaxCachableDecodedImageSizeInBytes) {
|
|
[self->_decodedImageCache setObject:image
|
|
forKey:cacheKey
|
|
cost:bytes];
|
|
}
|
|
}
|
|
|
|
- (UIImage *)imageForUrl:(NSString *)url
|
|
size:(CGSize)size
|
|
scale:(CGFloat)scale
|
|
resizeMode:(RCTResizeMode)resizeMode
|
|
responseDate:(NSString *)responseDate
|
|
{
|
|
NSString *cacheKey = RCTCacheKeyForImage(url, size, scale, resizeMode, responseDate);
|
|
return [_decodedImageCache objectForKey:cacheKey];
|
|
}
|
|
|
|
- (void)addImageToCache:(UIImage *)image
|
|
URL:(NSString *)url
|
|
size:(CGSize)size
|
|
scale:(CGFloat)scale
|
|
resizeMode:(RCTResizeMode)resizeMode
|
|
responseDate:(NSString *)responseDate
|
|
{
|
|
NSString *cacheKey = RCTCacheKeyForImage(url, size, scale, resizeMode, responseDate);
|
|
return [self addImageToCache:image forKey:cacheKey];
|
|
}
|
|
|
|
@end
|