Jakýkoliv způsob, jak získat mezipamětí UIImage z mého adresáře ‚Dokumenty‘?

hlasů
7

Vím, že -imageNamed: metoda vrátí mezipamětí UIImage, ale problém je, že můj obraz je soubor uložen v ‚Dokumenty‘ a -imageNamed: Metoda se zdá hledat pouze svazku ... Já jsem v současné době (neochotně) s použitím -imageWithContentsOfFile: dostat svůj obrázek z ‚dokumenty‘, ale není to totéž ... Zvyšování / dole UIImageView obsahující výsledný obraz je trhané a trapné. Změna velikosti stejné UIImageView obsahující obrazu tvořeného -imageNamed: však jeví jako velmi hladké. Takže ještě jednou: Jak mohu získat mezipaměti UIImage z mých ‚dokumenty‘, pokud nelze použít -imageNamed :?

Položena 27/08/2009 v 04:39
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
9

Udělal jsem o prodloužení odpovědi poskytnuté rpetrich a nedbal imagename: metodu přidat více poklesu náhradu. Hledá hlavního svazku a pak vypadá v adresáři mezipamětí. Dalo by se samozřejmě změnit adresář cache pamětí, aby adresáře dokumentů.

@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
Odpovězeno 12/11/2010 v 10:42
zdroj uživatelem

hlasů
8

Nejjednodušší způsob, jak by bylo NSMutableDictionaryukládání do mezipaměti obrázků a jasný způsob mezipaměti:

@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

Poznámka: měli byste zavolat +[UIImage clearCache]ze svého didReceiveMemoryWarningzpůsobu. Také clearCacheztratíte všechny objekty v mezipaměti, nikoli pouze nepoužité předměty; UIImagepodtřídy a složitější cache mechanismus by bylo zapotřebí, aby to napravila.

Odpovězeno 27/08/2009 v 06:20
zdroj uživatelem

hlasů
4

Můžete mezipaměti UIImagessami, stejně jako -imageNamed:dělá. Je to jen načte, a pak drží na nich. Můžete držet na ně, i za použití NSDictionarya realizovat svůj vlastní-imageNamed:

Ale já jsem více znepokojen problémy kterou máte s škálování. Jak jsou vaše obrázky dostat do dokumentů, jak se jim měřítko a jste testovali stejný obrazový soubor uložený ve svazku? Pochybuji, že -imageNamed:má co do činění s tím. Já bych ještě podezřelé věci, jako je skutečnost, že svazek má nějakou komprese aplikované (i když zatím nemají teorii o tom, proč by se tato záležitost v praxi), rozdíly v souboru, nebo rozdíly v tom, jak se zbytkem programu se chová při škálování (způsobující konflikty na disku nebo CPU). Caching je nepravděpodobné, vztahující se k této problematice.

Já bych udělat nějaké profilování w / nástroje, aby se pokusili zjistit, kde je choppiness pochází. Jste maxing disku, CPU, paměť? Jaký je překážkou?

Odpovězeno 27/08/2009 v 04:52
zdroj uživatelem

hlasů
1

Co psát svůj vlastní disk mezipaměť? Máte všechny kusy v místě, nyní stačí jej zapouzdřit a vést záznamy o obrazy, které jste již naloženy.

Odpovězeno 27/08/2009 v 04:46
zdroj uživatelem

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