9
votes

UIWebView n'appelle pas toujours - [Nsurlcache Storecachedresponse: Forquest:]

Il semble que uiwebview n'appelle pas toujours STORECACHEDRESPONSEPONSE: FORREQUEST: Chaque fois que c'est charger une ressource. Quelqu'un sait-il pourquoi? J'essaie de cacher des images en utilisant - [Nsurlcache Storecachedresponse: Forequest:] , il fasse la majeure partie du travail bien, mais dans certains cas uiwebview n'appelle pas cette méthode sur la charge de la page où il y a des images sur elle.


1 commentaires

Je remarque cela aussi; Bien que sur appareil pour mon application. Lorsque la vue Web charge une demande du Nsurlcache, il semble sauter sur ce même cache pour des actifs sur cette page.


5 Réponses :


4
votes

comme décrit ici NsurlConnection N'appelle pas STORECACHEDRESPONSEPONSE: FORREQUEST: Si la taille du fichier sur 50kb (52428 octets).
Essayez ASIHTTPEQUEST Caching .


1 commentaires

Je vois cela pour les petits fichiers (100 d'octets) également. Le webview ne parvient pas également à appeler CacheDresponseForrequest:



2
votes

Avez-vous vérifié l'état HTTP et les en-têtes de cache? Expire, contrôle-cache, etc.? Peut-être qu'un serveur répond avec Statut = 304 sans organisme de réponse?

- (void)connection:(NSURLConnection *)conn didReceiveResponse:(NSURLResponse *)aResponse 
{
  NSLog(@"CODE: %d", ((NSHTTPURLResponse *)aResponse).statusCode);
  NSLog(@"HEADERS: %@", ((NSHTTPURLResponse *)aResponse).allHeaderFields);
}


0 commentaires

11
votes

Réponse à la requête du fournisseur de primes:

Je vois cela pour de petits fichiers (100s d'octets) ainsi. WebView échoue également à l'appel cachedResponseForRequest:

J'ai trouvé cette question que ce comportement adresses directement:

En dépit de la documentation d'Apple indiquant autrement , NSURLCache sur iOS ne fait pas de disque (flash) la mise en cache du tout. Vous peut sous-classe NSURLCache pour modifier le comportement des fonctions de recherche et stocker les opérations d'utiliser le disque (comme SDURLCache fait), mais en raison du suite à des limitations sévères de la façon dont le cache est utilisé et mis en œuvre, cela ne fonctionne pas aussi bien que vous attendez:

  • 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 (200KB images), car il ne sera pas même pas dans le cache. Comme un Par conséquent, il faut ajouter la mise en cache manuellement à un niveau supérieur NSURLConnection .

  • Même si l'on appelle intégré du NSURLCache storeCachedResponse: forRequest: manuellement, il stocke seulement réponse en mémoire si elle est inférieure à 180Ko. Je l'ai testé par ce appelant storeCachedResponse manuellement et voyant que le avant / après currentMemoryUsage n'a pas changé pour les longueurs de données ci-dessus au sujet de 180KB. Nous devons donc écrire notre propre cache mémoire LRU aussi.

    (Non souligné.)

    Cela semble être responsable du comportement étant appelé. Comme les points de réponse acceptée en cours sur , ASIHTTPRequest est la solution de contournement prévue pour ce comportement.

    Cependant, noter que la mise en garde au haut de la page:

    S'il vous plaît noter que je ne travaille plus sur cette bibliothèque - vous pouvez envisager d'utiliser quelque chose d'autre pour les nouveaux projets. :)

    Vous devriez envisager compter sur les bibliothèques prises en charge ou, si vous préférez, contribuant revenir à cette bibliothèque une fois qu'il est à la base de votre code.


3 commentaires

Appréciez-le :) (et un excellent exemple d'où j'aurais dû rechercher plus fort) - Merci d'avoir pris le temps de creuser de manière approfondie!


@Nevir aucun problème! Je suis heureux que ce soit utile. :)


Est-ce que quelqu'un sait si cela reste le cas avec NsurlSession sur iOS 7/8? Je rencontre des problèmes d'obtenir Nsurlcache pour enregistrer de gros fichiers image (~ 7 Mo).



2
votes

Je ne suis pas sûr de savoir comment cela fonctionne pour un uiwebvieuue, mais lorsque vous utilisez un NSurLrequest, la taille maximale du fichier dépend de la manière dont vous initialisez l'urlcache (initwithMemoryCapacité: (Nsuinteger) MichelyCapacité ...) Je viens de mettre en cache un fichier de 2 Mo


1 commentaires

Pour moi, un fichier de 515kb .CSS demandé à partir de uiWebView peut être traité avec CacheResponseForrequest: d'un NsurlCache Sous-classe initialisé avec Michelcapacité: 0 DiskCapacité: 1024 * 1024 * 256



3
votes

nsurlcache fonctionne avec deux caches différents: cache sur disque et cache en mémoire

  • Les réponses seront en cache dans le cache en mémoire si la taille de la réponse est sous 50kb et
  • Les réponses seront mises en cache sur le cache sur disque si la taille de la réponse est sur 50kb

    Si vous initialisez NsurlCache avec DiskPath nil, le cache de disque sur disque ne sera pas actif et STORECACHEDResponse: ForQuest: ne sera appelé que pour les tailles de réponse inférieures à 50kb.

    alors configure votre urlcache comme ceci xxx


0 commentaires