Qualquer maneira de obter um cache UIImage do meu diretório 'Documentos'?

votos
7

Eu sei que o -imageNamed: método retorna uma cache UIImage, mas o problema é que meu arquivo de imagem é armazenado em 'Documentos', eo -imageNamed: método parece procurar apenas o Bundle ... Eu estou atualmente (relutantemente) usando -imageWithContentsOfFile: para obter a minha imagem de 'Documentos', mas não é o mesmo ... Scaling up / down um UIImageView que contém a imagem resultante é instável e desajeitada. Escalonar o mesmo UIImageView contendo uma imagem criada com -imageNamed: no entanto parece muito suave. Então, mais uma vez: Como posso obter um UIImage em cache do meu 'Documentos' se eu não posso usar -imageNamed :?

Publicado 27/08/2009 em 04:39
fonte usuário
Em outras línguas...                            


4 respostas

votos
9

Fiz uma extensão da resposta dada pelo rpetrich e cancelou o imageName: método para adicionar mais de uma gota de substituição. Ele procura o pacote principal em primeiro lugar e, em seguida, procura no diretório caches. Você poderia naturalmente alterar o diretório de caches para o directório documento.

@interface UIImage (CacheExtensions)
+ (UIImage *)imageNamed:(NSString *)name;
+ (void)clearCache;
@end

#import "UIImage+CacheExtensions.h"

static NSMutableDictionary *UIImageCache;

@implementation UIImage (CacheExtensions)

+ (UIImage *)imageNamed:(NSString *)name 
{
    id result;
    if (!UIImageCache)
        UIImageCache = [[NSMutableDictionary alloc] init];
    else {
        result = [UIImageCache objectForKey:name];
        if (result) return result;
    }

    // First, check the main bundle for the image
    NSString *imagePath = [[NSBundle mainBundle] pathForResource:name ofType:nil];

    result = [UIImage imageWithContentsOfFileimagePath];
    if(result) {
        [UIImageCache setObject:result forKey:name];
        return result;
    }

    // If not found, search for the image in the caches directory
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
    NSString *cachesImagePath = [[paths lastObject] stringByAppendingPathComponent:name];

    result = [UIImage imageWithContentsOfFile:cachesImagePath];
    if(result) {
        [UIImageCache setObject:result forKey:name];
        return result;
    }

    return nil;
}

+ (void)clearCache
{
    [UIImageCache removeAllObjects];
}

@end
Respondeu 12/11/2010 em 10:42
fonte usuário

votos
8

A maneira mais simples seria uma NSMutableDictionaryarmazenar as imagens em cache e um método de limpar o cache:

@interface UIImage (CacheExtensions)
+ (id)cachedImageWithContentsOfFile:(NSString *)path;
+ (void)clearCache;
@end

static NSMutableDictionary *UIImageCache;

@implementation UIImage (CacheExtensions)
+ (id)cachedImageWithContentsOfFile:(NSString *)path
{
    id result;
    if (!UIImageCache)
        UIImageCache = [[NSMutableDictionary alloc] init];
    else {
        result = [UIImageCache objectForKey:path];
        if (result)
            return result;
    }
    result = [UIImage imageWithContentsOfFile:path];
    [UIImageCache setObject:result forKey:path];
    return result;
}
+ (void)clearCache
{
    [UIImageCache removeAllObjects];
}
@end

Nota: você deve chamar +[UIImage clearCache]de seu didReceiveMemoryWarningmétodo. Além disso, clearCacheirá invalidar todos os objetos no cache, e não apenas itens não utilizados; uma UIImagesubclasse e mecanismo de cache mais complicado seria necessário para remediar esta situação.

Respondeu 27/08/2009 em 06:20
fonte usuário

votos
4

Você pode armazenar em cache UIImages-se assim como -imageNamed:o faz. Ele só carrega-los, e depois agarra-los. Você pode prendê-los, também, usando um NSDictionarye implementar seu próprio-imageNamed:

Mas estou mais preocupado com o problema que você está tendo com descamação. Como são suas imagens entrar em documentos, como você está escalando-os, e tê-lo testado o mesmo arquivo de imagem armazenado no pacote? Duvido que -imageNamed:tenha algo a ver com isso. Eu faria as coisas mais suspeitas, como o fato de que o pacote tem alguma compressão aplicadas a ele (embora eu ainda não tenho uma teoria sobre por que isso teria importância na prática), diferenças no arquivo, ou diferenças na forma como o resto do programa está se comportando durante a escala (causando contenção no disco ou CPU). Caching é improvável relacionados com esta questão.

Eu faria algumas profiling w / Instrumentos para tentar descobrir onde o choppiness está vindo. Você está estourar o limite de disco, CPU, memória? Qual é o gargalo?

Respondeu 27/08/2009 em 04:52
fonte usuário

votos
1

Que tal escrever o seu próprio cache de imagem? Você tem todas as peças no lugar, agora você só precisa encapsular-lo e manter um registro de imagens que você já carregados.

Respondeu 27/08/2009 em 04:46
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more