2009-08-28 9 views
20

Je remarque que le safari de l'iphone met en cache le contenu de sorte que votre page de chargement pour plus tard est beaucoup plus rapide, tout comme un navigateur de bureau. Donc, prenez la page web mobile gmail par exemple, la première charge est assez lente (5 à 10 secondes). Mais si je ferme l'onglet et rouvre la page, c'est très rapide (1 seconde). Toutefois, ce comportement n'est pas identique si vous chargez le contenu via un UIWebView dans votre application. Ai-je manqué quelques paramètres? Comment puis-je faire en sorte que UIWebView mette automatiquement en cache le contenu sans passer par le tracas d'enregistrer moi-même le contenu?Comment mettre en cache du contenu dans UIWebView pour un chargement plus rapide plus tard?

Répondre

1

Basé sur this discussion thread il semblerait qu'il n'y ait aucune mise en cache au niveau du système d'exploitation possible avec UIWebView. Basé sur l'expérience, j'ai remarqué que Safari sur mon iPhone OS ne met pas en cache ses pages Web (par exemple, appuyer sur le bouton de retour dans Safari ne recharge pas l'ancienne page à partir d'un cache).

+0

La mémoire cache ne fonctionne que sur le manifeste HTML 5 utilisé hors connexion. – jianhua

21

La clé est: NSURLRequestReturnCacheDataElseLoad

NSData *urlData; 
NSString *baseURLString = @"mysite.com"; 
NSString *urlString = [baseURLString stringByAppendingPathComponent:@"myfile"]; 

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval: 10.0]; 
NSURLConnection *connection=[[NSURLConnection alloc] initWithRequest:request delegate:nil]; 

if (connection) 
{ 
    urlData = [NSURLConnection sendSynchronousRequest: request]; 

    NSString *htmlString = [[NSString alloc] initWithData:urlData encoding:NSUTF8StringEncoding]; 
    [webView loadHTMLString:htmlString baseURL:baseURLString]; 
    [htmlString release]; 
} 

[connection release]; 
+9

La documentation iOS indique que NSURLRequestReturnCacheDataElseLoad "Spécifie que les données de cache existantes doivent être utilisées pour satisfaire une requête, quel que soit son âge ou sa date d'expiration." Ce n'est généralement pas ce que vous voulez, car il ignore les en-têtes de politique de cache comme max-age et ainsi de suite. Donc, cela ne semble pas être une bonne réponse générale. Le meilleur choix semble être "NSURLRequestUseProtocolCachePolicy" mais cela semble ne rien faire. – Yetanotherjosh

-1

Je l'ai fait quelques applications que les pages de cache dans le dossier Documents, puis comparer les horodatages des mises en cache & pages web avant de charger la nouvelle page Web . Ainsi, le débit de base est:

if (fileIsInCache) 
    if (cacheFileDate > webFileDate) 
     getCachedFile 
    else 
     getFileFromWeb 
     saveFileToCache 
else 
    getFileFromWeb 
    saveFileToCache 

stuffFileIntoUIView 

maybeReduceCache 

Vous avez encore de frapper le Web pour obtenir les en-têtes, mais qui est généralement beaucoup plus rapide que le téléchargement d'une page entière/image/fichier.

+6

Avez-vous un code d'exemple de ceci? – Tudorizer

2
NSString *stringurl=[NSString stringWithFormat:@"http://www.google.com"]; 
NSURL *url=[NSURL URLWithString:stringurl]; 
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:15.0]; 
[uiwebview loadRequest:theRequest]; 

Il va charger une première fois url recherche alors que pour les changements de contenu .., s'il n'y a aucune mise à jour du contenu URL il charge à partir du cache (stockage local).

+0

Pouvez-vous expliquer un peu? – Miki

+0

Il chargera une URL la première fois puis recherchera seulement les changements de contenu .., s'il n'y a pas de mises à jour dans le contenu de l'URL, il chargera à partir du cache (stockage local). –

+0

Ouais, mais faites cela en réponse – Miki

Questions connexes