Кэширование изображений для изображений в каталоге Documents - PullRequest
0 голосов
/ 02 февраля 2012

Мое приложение загружает пакет с изображениями по 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

1 Ответ

3 голосов
/ 02 февраля 2012

Ого ... Вы реализуете свой собственный объектный кеш?Вы впервые взглянули на NSCache , чтобы увидеть, соответствует ли он вашим потребностям?

(я не верю, что UIImage соответствует NSDiscardableContent, поэтому вам придется либо очистить кеш самостоятельно, либоОберните UIImage, если вы хотите, чтобы кеш обрабатывал условия нехватки памяти. Но, как вы заметили в своем вопросе, ваша текущая реализация также не делает этого.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...