De toute façon d'obtenir un UIImage de mon répertoire cache « Documents »?

voix
7

Je sais que le -imageNamed: méthode retourne un UIImage cache, mais le problème est que mon fichier image est stocké dans « Documents », et la -imageNamed: méthode semble ... Je suis actuellement à la recherche que le faisceau ( à contrecoeur) à l' aide -imageWithContentsOfFile: pour obtenir mon image de « documents » , mais ce n'est pas le même ... Mise à l' échelle vers le haut / bas une UIImageView contenant l'image résultante est saccadée et maladroit. Mise à l' échelle de la même UIImageView contenant une image créée avec -imageNamed: apparaît cependant très lisse. Donc, encore une fois: Comment puis - je obtenir un cache UIImage de mes « Documents » si je ne peux pas utiliser -imageNamed :?

Créé 27/08/2009 à 04:39
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
9

J'ai fait une extension de la réponse fournie par rpetrich et l'emportaient sur la imageName: méthode pour ajouter plus d'une baisse de remplacement. Il recherche le faisceau principal d'abord et puis regarde dans le répertoire des caches. Vous pouvez bien sûr changer le répertoire des caches dans le répertoire de documents.

@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
Créé 12/11/2010 à 10:42
source utilisateur

voix
8

La façon la plus simple serait un NSMutableDictionarystockage des images mises en cache et une méthode de cache claire:

@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

Remarque: vous devez appeler à +[UIImage clearCache]partir de votre didReceiveMemoryWarningméthode. En outre, clearCacheannulera tous les objets dans le cache, non seulement des éléments inutilisés; une UIImagesous - classe et le mécanisme de mise en cache plus complexe seraient nécessaires pour y remédier.

Créé 27/08/2009 à 06:20
source utilisateur

voix
4

Vous pouvez mettre en cache UIImagesvous comme le -imageNamed:fait. Il leur charge juste, et tient ensuite sur eux. Vous pouvez tenir sur eux aussi, en utilisant un NSDictionaryet mettre en œuvre votre propre-imageNamed:

Mais je suis plus préoccupé par le problème que vous avez avec mise à l' échelle. Comment vos images deviennent dans les documents, comment allez - vous les mise à l' échelle, et avez - vous testé le même fichier image stockée dans le paquet? Je doute que -imageNamed:n'a rien à voir avec cela. Je voudrais plus suspect des choses comme le fait que le faisceau a une certaine compression appliquée à elle (bien que je n'ai pas encore une théorie sur la raison pour laquelle ce serait la matière dans la pratique), les différences dans le fichier, ou les différences dans la façon dont le reste du programme se comporte au cours de mise à l' échelle ( ce qui provoque les conflits sur le disque ou CPU). Mise en cache est peu probable lié à cette question.

Je fais un peu de profilage w / Instruments pour essayer de savoir où le clapotis vient. Est-ce que vous maxing le disque, CPU, mémoire? Quel est le goulot d'étranglement?

Créé 27/08/2009 à 04:52
source utilisateur

voix
1

Qu'en est-il d'écrire votre propre cache d'image? Vous avez toutes les pièces en place, maintenant, vous avez juste besoin de résumer et conserver un enregistrement d'images que vous avez déjà chargé.

Créé 27/08/2009 à 04:46
source utilisateur

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