2011-08-23 4 views
9

Malgré la documentation d'Apple indicating otherwise, NSURLCache sur iOS ne fait aucune mise en cache de disque (flash). Vous pouvez sous-classer NSURLCache pour changer le comportement des opérations d'extraction et de stockage pour utiliser le disque (comme le fait SDURLCache), mais en raison des limitations sévères suivantes de la façon dont le cache est utilisé et implémenté, cela ne fonctionne pas aussi bien que vous d attendre:NSURLConnection sur iOS n'essaie pas de mettre en cache des objets supérieurs à 50 Ko

  • NSURLConnection ne remet même pas storeCachedResponse:forRequest: pour les fichiers sur environ 50 Ko (> = 52428 octets, pour être exact). Cela rend le sous-classement NSURLCache inutile pour notre utilisation (images de 200 Ko), car il ne sera même pas dans le cache. Par conséquent, nous devons ajouter manuellement la mise en cache à un niveau supérieur à NSURLConnection.
  • Même lorsque l'on appelle manuellement le storeCachedResponse:forRequest: intégré de NSURLCache, il ne stocke la réponse en mémoire que si elle est inférieure à environ 180 Ko. J'ai testé cela en appelant storeCachedResponse manuellement et en voyant que le currentMemoryUsage avant/après n'a pas changé pour les longueurs de données supérieures à environ 180KB. Nous devons donc écrire notre propre mémoire cache LRU.

Quelqu'un d'autre a-t-il remarqué ces problèmes? Ou y a-t-il quelque chose qui me manque?

Pour votre information, je suis en cours d'exécution iOS 4.3 dans le simulateur et sur un iPad 2.

Répondre

1

Je suggère d'utiliser la bibliothèque three20 et TTURLRequest. Cela semble avoir une bonne mise en cache pour les grandes tailles de données, car il est utilisé pour Facebook et en particulier les images.

TTURLRequest est à peu près une baisse de remplacement pour un NSURLRequest, devrait donc être facile de se déplacer, et n'a pas beaucoup de dépendance à l'égard du reste de Three20

2

Je ne sais pas comment cela fonctionne pour une UIWebvieuw, mais lorsque vous utilisez un NSURLRequest la taille maximale du fichier dépend sur comment initialiser le URLCache (initWithMemoryCapacity: (NSUInteger) memoryCapacity ...)

Questions connexes