2010-02-28 17 views
4

J'ai un UITableView dont les cellules contiennent des ImageViews personnalisés qui chargent de manière asynchrone les images à partir d'Internet. Pour charger ces images j'utilise NSURLRequest et NSURLConnection qui fonctionne bien. Le seul problème est que les images ne sont pas mises en cache et sont donc téléchargées chaque fois qu'elles sont utilisées. J'ai essayé de mettre le cachePolicy du NSURLRequest à "NSURLRequestReturnCacheDataElseLoad" sans effet.La mise en cache de disque avec NSURLRequest et NSURLConnection fonctionne-t-elle réellement sur l'iPhone?

Il semble que d'après la dernière réponse sur link, la mise en cache de disque n'est pas prise en charge avec NSURLRequest sur l'iPhone. Est-ce correct?

Si cela devait fonctionner, je serais intéressé de savoir quelle pourrait être la raison pour laquelle cela ne fonctionne pas dans mon cas.

Voici le code:

NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://myurl"] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:60.0]; 


connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

Répondre

3

Je pense que cela devrait fonctionner. Si ce n'est pas le cas, cela peut signifier que le serveur Web est en train de diffuser du contenu qui n'est pas mis en cache. Par exemple, car il ne définit pas les bons en-têtes.

Si vous pouvez poster un lien vers l'une des images, nous pouvons regarder de plus près.

HTTP/1.1 200 OK 
Date: Mon, 01 Mar 2010 12:40:46 GMT 
Server: Apache 
Last-Modified: Mon, 01 Mar 2010 09:33:29 GMT 
ETag: "25e8dd2-11a6-480b9f1178c40" 
Accept-Ranges: bytes 
Content-Length: 4518 
Keep-Alive: timeout=15, max=100 
Connection: Keep-Alive 
Content-Type: image/png 

Voici ce que vos images renvoient en en-tête. Je ne vois pas un en-tête Expires ou Cache-Control, ce qui explique peut-être pourquoi ils ne sont pas mis en cache. Je pense qu'en ce qui concerne WebKit, il s'agit d'un contenu dynamique qui devrait être rechargé à chaque fois. la mise en cache

+0

Voici un lien vers l'une des images: http://datenmafia.org/misc/1.png – kiteloop

0

NSURLCache sur disque travaille depuis iOS 5. Par défaut NSURLCache ne pas utiliser la mise en cache sur disque, vous devez l'activer vous-même:

NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:(1024*1024*512) diskCapacity:(1024*1024*1024 * 100) [email protected]"Cache.db"]; 
[NSURLCache setSharedURLCache:cache]; 

Cela définira le cache d'URL globale à utiliser pour le système de chargement d'URL. Pour la plupart, cela va "juste fonctionner". Si votre requête utilise NSURLRequestUseProtocolCachePolicy, qui est la valeur par défaut, le système de chargement d'URL sera mis en cache avec les durées de vie indiquées par la réponse du serveur distant. Des services tels que REDbot peuvent vous indiquer la durée de vie du cache d'une réponse donnée.

NSURLSessionConfiguration peut être configuré pour utiliser des caches séparés, mais en pratique, cela ne fonctionne pas comme documenté. Depuis iOS 8, si plusieurs NSURLCache sont configurés, seul le premier sera effectivement utilisé.

Il y a des comportements sans papiers supplémentaires lors de l'utilisation sur le stockage disque avec NSURLCache: - Si le diskCapacity est réglé à moins de 5 Mo, il ne sera pas utilisé. - La purge et le redimensionnement du cache ne fonctionnent souvent pas comme prévu. Certains d'entre eux ont été corrigés dans iOS 8, d'autres non. - currentDiskUsage Les informations sont souvent incorrectes. - Sur certaines versions iOS, NSURLCache ignore la limite définie par diskCapacity et augmente le cache sur disque sans limites. Cela dit, NSURLCache sur la mise en cache du disque fait généralement la bonne chose. Si vous créez un cache sur disque comme ci-dessus lorsque votre application démarre, le cache conservera les réponses au disque et le système de chargement d'URL utilisera ces réponses mises en cache. Une fois que vous avez configuré le cache comme ci-dessus, vous n'avez pas besoin d'interagir directement avec le cache - le système de chargement d'URL le fait pour vous. L'exception est NSURLSession, où la mise en cache semble encore un peu cassée.