Мое приложение загружает пакет с изображениями по HTTP.Они хранятся в каталоге Documents / и отображаются.
Я прочитал, что UIImage не работает для кэширования изображения в каталоге "... / Documents /" iphone / ipad (потому что только [UIImage imageNamed:] использовать кеш, и он работает только для изображений в комплекте).Кроме того, я хочу иметь возможность очищать кеш при загрузке нового пакета.
Итак, вот что я написал:
В Image.h
#import <Foundation/Foundation.h>
@interface Image : NSObject
+(void) clearCache;
+(UIImage *) imageInDocuments:(NSString *)imageName ;
+(void)addToDictionary:(NSString *)imageName image:(UIImage *)image;
@end
In Image.m
#import "Image.h"
@implementation Image
static NSDictionary * cache;
static NSDictionary * fifo;
static NSNumber * indexFifo;
static NSInteger maxFifo = 25;
+(void)initialize {
[self clearCache];
}
+(void) clearCache {
cache = [[NSDictionary alloc] init];
fifo = [[NSDictionary alloc] init];
indexFifo = [NSNumber numberWithInt:0];
}
+(UIImage *) imageInDocuments:(NSString *)imageName {
UIImage * imageFromCache = [cache objectForKey:imageName];
if(imageFromCache != nil) return imageFromCache;
NSString * path = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"/Documents/%@", imageName, nil]];
UIImage * result = [UIImage imageWithContentsOfFile:path];
[self addToDictionary:imageName image:result];
return result;
}
+(void)addToDictionary:(NSString *)imageName image:(UIImage *)image {
NSMutableDictionary *mFifo = [fifo mutableCopy];
NSString * imageToRemoveFromCache = [mFifo objectForKey:indexFifo];
[mFifo setObject:imageName forKey:indexFifo];
fifo = [NSDictionary dictionaryWithDictionary:mFifo];
// indexFifo is like a cursor which loop in the range [0..maxFifo];
indexFifo = [NSNumber numberWithInt:([indexFifo intValue] + 1) % maxFifo];
NSMutableDictionary * mcache = [cache mutableCopy];
[mcache setObject:image forKey:imageName];
if(imageToRemoveFromCache != nil) [mcache removeObjectForKey:imageToRemoveFromCache];
cache = [NSDictionary dictionaryWithDictionary:mcache];
}
@end
Я написал это, чтобы улучшить производительность при загрузке изображения.Но я не уверен с реализацией.Я не хотел бы иметь обратный эффект:
- Существует много повторных копий (от изменяемого словаря до неизменного и наоборот)
- Я не знаю, как выбратьправильное значение maxFifo.
- Как вы думаете, мне нужно обрабатывать предупреждение о памяти и очищать кэш, когда это происходит?
Что вы думаете?это неловко?
ps: я положил код на gist.github: https://gist.github.com/1719871