Sur iPhone, j'effectue une requête HTTP en utilisant NSURLRequest pour un morceau de données. Les pics d'allocation d'objets et j'attribue les données en conséquence. Lorsque j'en ai fini avec les données, je les libère en conséquence - cependant, les instruments ne montrent pas que les données ont été libérées!
Ma théorie est que par défaut, les requêtes HTTP sont mises en cache, cependant - je ne veux pas que mon application iPhone cache ces données.
Existe-t-il un moyen de vider ce cache après une demande ou d'empêcher la mise en cache des données en premier lieu?
J'ai essayé d'utiliser toutes les politiques de cache documentées un peu comme ci-dessous:
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
theRequest.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
mais rien ne semble libérer la mémoire!
cocoa-touch
caching
Nick Cartwright
la source
la source
Réponses:
Habituellement, il est plus facile de créer la demande comme ceci
Puis créez la connexion
et implémentez la méthode connection: willCacheResponse: sur le délégué. Le simple retour de zéro devrait le faire.
la source
NSURLRequestReloadIgnoringCacheData
et de mettre en œuvreconnection:willCacheResponse:
?connection:willCacheResponse:
vous permet de ne pas stocker la réponse dans le cache.NSURLRequestReloadIgnoringCacheData
spécifie que la connexion doit charger la demande sans vérifier le cache. Le premier est probablement ce qui aide à gérer l'allocation de mémoire.J'ai le même problème dans mon application lorsque j'ai demandé des informations à Twitter. Dans mon cas, je n'avais pas besoin de conserver ces informations d'identification, donc je les efface simplement en utilisant le code suivant:
J'espère que ça marche pour quelqu'un :)
la source
Si vous utilisez NSURLConnection, jetez un œil au délégué:
Valeur de retour
La réponse réelle mise en cache à stocker dans le cache. Le délégué peut renvoyer cachedResponse non modifié, renvoyer une réponse mise en cache modifiée ou renvoyer nil si aucune réponse mise en cache ne doit être stockée pour la connexion.
la source
Si vous utilisez
NSURLSession
, une autre solution pour empêcher la demande et les paramètres d'être écrits dansCache.db
iOS crée dans leCaches
répertoire de l'application , consiste à définir la configurationNSURLCache
de la session sur une mémoire de taille 0 et un cache disque de taille 0, par exempleou comme mentionné ci-dessus défini à un niveau de cache global
C'est probablement le 0 pour la taille du disque qui arrête l'écriture d'iOS sur le disque, mais si vous avez une politique,
reloadIgnoringLocalCacheData
vous n'êtes probablement pas non plus intéressé par la mise en cache de la mémoire.Remarque Cela empêchera toute
Caches/Cache.db
(demandes et réponses) ouCaches/fsCachedData/
création de dossier (données de réponse). Nous avons décidé d'adopter cette approche dans une application à des fins de sécurité, car nous ne voulons jamais que nos demandes soient stockées sur le cache disque.Si quelqu'un sait qu'il existe un moyen d'arrêter uniquement la mise en cache des demandes mais de conserver la mise en cache des données de réponse du mécanisme de chargement d'URL iOS, je serais intéressé de savoir. (il n'y a pas d'API ou de documentation officielle à ce sujet d'après ce que je peux dire)
la source
Si ce n'est pas spécifique à une seule demande (vous voulez désactiver le cache pour toute l'application) ci-dessous est la meilleure option.Ajoutez ce code dans le délégué d'application ou en fonction de votre besoin n'importe où
la source
En supposant que le serveur est correctement implémenté, mettre l'en-
Cache-Control:no-store
tête dans la requête générera une réponse du serveur avec le même en-tête, provoquant ainsi leNSURLCache
non stockage des données de réponse sur le disque.Par conséquent, pas besoin de l'approche fusil à pompe de désactivation
NSURLCache
de la mise en cache du disque.PS: l'ajout de l'en-tête devrait fonctionner pour tous les frameworks HTTP, comme
AFNetworking
la source