2012-10-25 1 views
1

J'ai une application qui télécharge des images à partir du serveur. Les images sont d'environ 56 Ko et il y en a au moins 30. Il y a des moments où l'utilisateur n'a pas de connexion ou de connexion Edge (Dialup).NSURLCache Images Utilisation de l'API AFNetworking

J'utilise NSURLCache dans mes AppDelegate.h comme ceci:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    int cacheSizeMemory = 4*1024*1024; // 4MB 
    int cacheSizeDisk = 32*1024*1024; // 32MB 
    NSURLCache *sharedCache = [[[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"] autorelease]; 
    [NSURLCache setSharedURLCache:sharedCache]; 

Mais pour une raison quelconque, il ne cache pas les images. Si je charge toutes les images avec une connexion Internet disponible, puis déconnecte ou utilise le réseau Edge, il récupère à nouveau les images.

+0

Impossible de résoudre votre problème, mais: Êtes-vous conscient que AFNetworking fournit une catégorie sur UIImageView pour faciliter le chargement des images à distance (y compris la mise en cache!)? http://engineering.gowalla.com/AFNetworking/Categories/UIImageView(AFNetworking).html –

+0

Yup! J'utilise déjà cette catégorie mais sur le réseau Edge (c'est ce que j'ai eu hehe) c'est super lent. – azamsharp

+0

Peut-être, vous devriez fournir plus de détails (code) sur la façon dont vous chargez/cachez les images. –

Répondre

1

Modifier: iOS 5 et prend en charge la mise en cache du disque partir si vous utilisez NSURLRequestReturnCacheDataElseLoad cachePolicy de NSURLRequest ou de retourner les en-têtes Cache-Control appropriés.

Ce problème de mise en cache est expliqué dans le document AFNetworking F.A.Q..

En résumé, il semble que sur iOS, NSURLCache ne fournit pas la capacité de cache disque, même si vous créez un NSURLCache avec un diskCapacity>0 (il semble être ignoré), et la solution est d'utiliser une autre implémentation de NSURLCache comme le suggéré dans la FAQ.

+0

Intéressant, merci! –

+7

En fait avec iOS 5 ce n'est plus vrai. iOS 5 avec NSURLCache DOES en fait stocker le cache sur le disque. Vous pouvez le vérifier dans votre dossier de bibliothèque il y aura dossier de caches et dans les caches vous trouverez le nom de cache. – azamsharp

+0

@azamsharp Oui merci pour la précision. J'ai lu sur ce bugfix dans iOS5 aussi, mais je l'ai oublié;) _ (Mais en supposant que l'OP a le problème avec sa mise en cache, peut-être qu'il teste encore son application dans iOS4?) – AliSoftware

0

Vous devez avoir accès au serveur pour vous assurer qu'il renvoie l'en-tête de contrôle de cache pour que chaque requête de NSURLCache soit utile. Si vous ne pouvez pas ou ne pouvez pas obtenir cette configuration (comme dans mon scénario), vous devrez rouler votre propre couche de mise en cache ou utiliser quelque chose comme SDURLCache ou RNCachingURLProtocol.

Questions connexes