1
0
mirror of https://github.com/danog/Telegram.git synced 2024-12-03 09:57:46 +01:00
Telegram/Telegraph/TGMediaStoreContext.m
2016-02-25 01:03:51 +01:00

153 lines
4.5 KiB
Objective-C

#import "TGMediaStoreContext.h"
#import "ATQueue.h"
#import "TGMemoryImageCache.h"
#import <pthread.h>
#import "TGAppDelegate.h"
@interface TGMediaStoreContext ()
{
NSMutableDictionary *_mediaImageAverageColorCache;
TGMemoryImageCache *_mediaImageCache;
TGMemoryImageCache *_mediaReducedImageCache;
pthread_rwlock_t _mediaImageAverageColorCacheLock;
pthread_rwlock_t _mediaImageCacheLock;
pthread_rwlock_t _mediaReducedImageCacheLock;
ATQueue *_mediaReducedImageGenerationQueue;
TGModernCache *_temporaryFilesCache;
}
@end
@implementation TGMediaStoreContext
- (instancetype)init
{
self = [super init];
if (self != nil)
{
_mediaImageAverageColorCache = [[NSMutableDictionary alloc] init];
float factor = [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad ? 3.0f : 1.0f;
_mediaImageCache = [[TGMemoryImageCache alloc] initWithSoftMemoryLimit:(NSUInteger)(2 * 1024 * 1024 * factor) hardMemoryLimit:(NSUInteger)(3 * 1024 * 1024 * factor)];
_mediaReducedImageCache = [[TGMemoryImageCache alloc] initWithSoftMemoryLimit:(NSUInteger)(1.5 * 1024 * 1024 * factor) hardMemoryLimit:(NSUInteger)(2.5 * 1024 * 1024 * factor)];
pthread_rwlock_init(&_mediaImageAverageColorCacheLock, NULL);
pthread_rwlock_init(&_mediaImageCacheLock, NULL);
pthread_rwlock_init(&_mediaReducedImageCacheLock, NULL);
NSString *tempCachePath = [[TGAppDelegate documentsPath] stringByAppendingPathComponent:@"tempcache_v1"];
_temporaryFilesCache = [[TGModernCache alloc] initWithPath:tempCachePath size:100 * 1024 * 1024];
_mediaReducedImageGenerationQueue = [[ATQueue alloc] init];
}
return self;
}
- (TGModernCache *)temporaryFilesCache
{
return _temporaryFilesCache;
}
+ (TGMediaStoreContext *)instance
{
static TGMediaStoreContext *singleton = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
{
singleton = [[TGMediaStoreContext alloc] init];
});
return singleton;
}
- (NSNumber *)mediaImageAverageColor:(NSString *)key
{
if (key == nil)
return nil;
NSNumber *result = nil;
pthread_rwlock_rdlock(&_mediaImageAverageColorCacheLock);
result = _mediaImageAverageColorCache[key];
pthread_rwlock_unlock(&_mediaImageAverageColorCacheLock);
return result;
}
- (void)setMediaImageAverageColorForKey:(NSString *)key averageColor:(NSNumber *)averageColor
{
if (key == nil)
return;
pthread_rwlock_wrlock(&_mediaImageAverageColorCacheLock);
_mediaImageAverageColorCache[key] = averageColor;
pthread_rwlock_unlock(&_mediaImageAverageColorCacheLock);
}
- (UIImage *)mediaReducedImage:(NSString *)key attributes:(__autoreleasing NSDictionary **)attributes
{
if (key == nil)
return nil;
UIImage *result = nil;
NSDictionary *tempAttributes = nil;
pthread_rwlock_rdlock(&_mediaReducedImageCacheLock);
result = [_mediaReducedImageCache imageForKey:key attributes:&tempAttributes];
pthread_rwlock_unlock(&_mediaReducedImageCacheLock);
if (attributes != NULL)
*attributes = tempAttributes;
return result;
}
- (void)setMediaReducedImageForKey:(NSString *)key reducedImage:(UIImage *)reducedImage attributes:(NSDictionary *)attributes
{
if (key == nil || reducedImage == nil)
return;
pthread_rwlock_wrlock(&_mediaReducedImageCacheLock);
[_mediaReducedImageCache setImage:reducedImage forKey:key attributes:attributes];
pthread_rwlock_unlock(&_mediaReducedImageCacheLock);
}
- (UIImage *)mediaImage:(NSString *)key attributes:(__autoreleasing NSDictionary **)attributes
{
if (key == nil)
return nil;
UIImage *result = nil;
NSDictionary *tempAttributes = nil;
pthread_rwlock_rdlock(&_mediaImageCacheLock);
result = [_mediaImageCache imageForKey:key attributes:&tempAttributes];
pthread_rwlock_unlock(&_mediaImageCacheLock);
if (attributes != NULL)
*attributes = tempAttributes;
return result;
}
- (void)setMediaImageForKey:(NSString *)key image:(UIImage *)image attributes:(NSDictionary *)attributes
{
if (key == nil || image == nil)
return;
pthread_rwlock_wrlock(&_mediaImageCacheLock);
[_mediaImageCache setImage:image forKey:key attributes:attributes];
pthread_rwlock_unlock(&_mediaImageCacheLock);
}
- (void)inMediaReducedImageCacheGenerationQueue:(dispatch_block_t)block
{
[_mediaReducedImageGenerationQueue dispatch:block];
}
@end