6
votes

Comment enregistrer le contenu dans UIWebView pour un chargement plus rapide lors du prochain lancement?

Je sais que certaines classes de mise en cache sont introduites dans l'iPhone SDK récemment, et il existe également un Turlrequest de la bibliothèque de trois20 qui vous permet de mettre en cache une demande à une URL. Cependant, parce que je charge la page Web dans UiWebView en appelant WHOWWebView's LoadRequest, ces techniques ne sont pas vraiment applicables.

Des idées Comment je peux enregistrer une page Web afin que sur le prochain lancement de l'application, je n'ai pas à chercher à nouveau du Web pour la page complète? La page elle-même a déjà un mécanisme Ajax qui met à jour des pièces d'elle-même automatiquement.


0 commentaires

5 Réponses :


1
votes

Vous pouvez enregistrer un HTML dans le répertoire de documents et charger la page directement à partir du répertoire de documents sur le lancement.

Pour enregistrer le contenu WEBVIEW: Lecture de contenu HTML à partir d'une UIWebView

à charger: xxx


0 commentaires

2
votes

Si la page a déjà AJAX, pourquoi ne pas stocker le JavaScript / HTML dans le paquet d'applications pour commencer plutôt que de le télécharger lors du premier lancement? Ensuite, chargez la page avec le code Corey donnant ci-dessous et laissez la poignée AJAX frapper le réseau pour les parties mises à jour de la page.


0 commentaires

17
votes

Il y a un tas d'articles sur la manière dont le cache de l'UIWebView fonctionne et le sentiment global est que même si certains mécanismes semblent fonctionner correctement sous MacOS X, les mêmes approches peuvent avoir un comportement curieux sous iPhone.


< p> Cependant, Je le fais en jouant avec le cache global accessible par tout nsurlconnection , uiwebview inclus. et dans mon cas, cela fonctionne;).

Ce que vous devez comprendre est le flux global:

  • vous -> loadRequest sur un uiwebview
  • ceci passe dans nsurlcache à poser "y a-t-il quelque chose de caché pour cette demande?": xxx

    à partir de celui-ci, voici ce que je fais pour gérer le cache sur le disque, de mon côté, pour accélérer la charge d'une UIWebView:

    • Sous-classe The NsurlCache et remplace le contrôle GET sur le - (NSCacheDurLResponse *) CacheResponseForrequest: (Nsurlrequest *) Demande Sélecteur
    • Réimplément ce sélecteur de manière à ce que, si rien n'a été écrit sur la FS pour cette demande (pas de cache), alors faites la demande de votre côté et stockez le contenu sur FS. Sinon, retournez ce qui a déjà été mis en cache.
    • Créez une instance de votre sous-classe et définissez-la sur le système afin qu'il soit utilisé par votre application

      maintenant le code:

      myCache.h xxx

      mycache.m xxx

      et l'utilisation de celui-ci dans votre application: xxx

      Ce code mérite beaucoup de nettoyage .. Mais les principales choses devraient être là-bas. J'ai eu beaucoup de problèmes pour que cela fonctionne, j'espère que cela aide.


5 commentaires

Merci. Votre approche semble le seul moyen d'enregistrer des contenus de page Web avec toutes les ressources sans analyse HTML. Mais comme je vois, nous chargons en fait chaque ressource deux fois: par webview lui-même lorsque nous retournons nul responce, puis nous chargons la même demande dans la méthode "populatecaCefor". Des idées pour résoudre ceci?


Le truc que vous avez utilisé dans CachedResponseForrequest: Demande: est intelligente, mais le chargement des ressources sonne deux fois vaguement mal. :-) N'y a-t-il vraiment aucun moyen d'obtenir uiWebView de jouer sympa avec le reste du monde?


Hum, oui, je n'ai pas fait attention à ça, mais tu as raison. Je ne me souviens pas exactement pourquoi j'ai peuplé le cache asynchrone, mais peut-être qu'il serait logique de le rendre synchrone et de renvoyer le résultat au lieu de NIL à l'UIWebView (évitant la demande d'être effectuée à nouveau par la vue Web ...: /) i Peut-on regarder cela depuis que je suis toujours dans ce genre de choses ... (malheureusement: /)


J'ai vérifié ça. Le fait de fonctionner de manière synchrone, le flux correct est (synchrone), vérifiez si le cache a été rempli, sinon, le faire de manière synchrone, puis le renvoie. La conséquence est que NIL n'est plus rentré.


Malheureusement, vous êtes coincé entre un rocher et un lieu difficile - chargez de manière asynchrone et vous allez chercher à chaque ressource deux fois. Chargez de manière synchrone et vous bloquez d'autres ressources (les plus visibles avec des images) du chargement en téléchargeant une ressource incachetée. L'une ou l'autre méthode est meilleure qu'un système complètement incaché.



3
votes

J'ai récemment trouvé ce projet sous Github: http://github.com/rs/sdurlcache L'approche est la même chose que ma réponse précédente décrite ici Comment enregistrer le contenu dans UiWebView pour un chargement plus rapide sur le prochain lancement? , mais le code semble plus polie, alors peut-être qu'il est logique de le faire essayer.


0 commentaires

2
votes