Ne NSURLConnection profiter de NSURLCache?
Je suis à essayer de comprendre comment utiliser l'URL de chargement de cadre à la charge Url profitant de la mise en cache.
Je suis en utilisant NSURLConnections et les nourrir NSURLRequests. J'ai même mis le cachePolicy sur les demandes de NSURLRequestReturnCacheDataElseLoad. La première fois que je charge une demande, il le fait automatiquement mises dans le cache ([NSURLCache sharedCache]
l'a). Mais la prochaine fois que je charge la même demande, le NSURLConnection semble ignorer ce qui est dans le cache et recharger les données.
Suis-je censé être manuellement la mise en œuvre de cache de recherches et de retourner les données mises en cache? Ne NSURLConnection de ne pas le faire? Ou est-il un moyen pour obtenir le cadre de l'utilisation du cache de façon transparente?
Mise à JOUR: Essayé sans succès:
- Réglage de la demande, stratégie de cache pour
NSURLRequestReturnCacheDataElseLoad
au lieu deNSURLRequestUseProtocolCachePolicy
- De ré-utilisation de l'objet de la requête au lieu de faire un nouveau
- À l'aide de
+[NSURLConnection sendSynchronousRequest:returningResponse:error:]
au lieu de charger de manière asynchrone
Où est-il le demande les données à partir de? C'est une page statique ou dynamique avec les entêtes HTTP appropriés? Peut-être l'Expire, Si-Modified-since ou-tête Cache-Control sont des raisons impérieuses le cache?
Non, je suis en train de faire une nouvelle NSURLRequest. Mais quand je fais
[[NSURLCache sharedURLCache] cachedResponseForRequest:]
avec ce nouvel objet de demande, il n'y est une réponse en cache. Ainsi, le NSURLCache en quelque sorte sait que les demandes sont les mêmes.PS: j'ai essayé de réutiliser le NSURLRequest objet. Ne pas faire une différence.
De bonnes idées. J'ai essayé à la fois statique et dynamique, ne semble pas faire une différence. Ne voyez pas les en-têtes vous dessus décrite sur la demande ou de la réponse.
OriginalL'auteur jasoncrawford | 2009-12-08
Vous devez vous connecter pour publier un commentaire.
NOTE iOS à partir de 5 fournir un sharedURLCache qui a les deux de la mémoire et de la capacité du disque.
Rien ne cache, sauf si vous définissez la NSURLCache avoir une certaine capacité:
La valeur par défaut de l'iPhone NSURLCache instance refuse à jamais en mémoire cache sur le disque. si vous avez besoin de ce comportement, vous devez sous-classe NSURLCache et de mettre en œuvre votre propre cache disque. J'ai trouvé de nombreux exemples de caches sur GitHub, mais aucun d'entre eux de faire le nécessaire pour "nettoyer" l'étape de manière satisfaisante à mon humble avis.
Même si vous n'avez pas l'installation d'un cache de manière explicite, NSURLCache crée toujours un fichier de base de données et encore enregistre le contenu!
oui, ma réponse est antérieure d'iOS 5. Depuis lors, le cache est toujours mis en place, sauf si vous désactivez-le.
OriginalL'auteur mxcl
Il sera en effet l'utilisation NSURLCache automatiquement, au moins dans certaines circonstances. Certes, il ne dans le code suivant:
EDIT - travaille dans un OS X 10.6 Cacao application, n'a pas d'iPhone (mal lu la question)
OK, alors j'ai essayé, et ça ne marche pas pour moi. La deuxième demande encore faut plusieurs centaines de millisecondes, et si j'utilise le cache de la politique
NSURLRequestReturnCacheDataDontLoad
, elle renvoie 0 octets. De plus, si je le cache de requête directement entre l'aide[[NSURLCache sharedURLCache] cachedResponseForRequest:req]
, elle renvoie nil. Donc il n'y a pas de mise en cache qui se passe ici pour moi. Je suis en cours d'exécution dans le simulateur d'iPhone, simulant OS 3.0 (également essayé 3.1.2), sous Snow Leopard.Droit, peut-être quelque chose à faire avec je suis juste en cours d'exécution directement sous OS X. je n'ai pas repéré l'iphone tag - désolé.
OriginalL'auteur Nick Moore
Avez-vous essayé de jouer avec le
connection:willCacheResponse:
méthode? Selon le URL de Chargement de la documentation du Système d' Par défaut, les données de connexion est mis en cache en fonction de l'appui fourni par le NSURLProtocol sous-classe qui gère la demande. Un NSURLConnection Delegationdelegate pouvez affiner ce comportement par la mise en œuvre de connexion:willCacheResponse:."connection:willCacheResponse:
--ne l'aide pas. Cette méthode est appelée, et--voici le kicker--la réponse certainement de se retrouver dans le cache. Après la première demande,[[NSURLCache sharedCache] cachedResponseForRequest:request]
renvoie la réponse en cache. Mais si je puis initialiser un NSURLConnection avec la même demande, elle récupère de nouveau plutôt que de frapper le cache.Je sais que dans le passé, j'ai jeté un coup d'oeil dans le cache, et qui a contribué, bien que dans cette situation particulière, je voulais la méthode pour retourner immédiatement plutôt que de charger de manière asynchrone, si possible.
OriginalL'auteur Colin Barrett