2010-06-10 4 views
2

Je rencontre des problèmes avec la mise en cache des URLResponses sur le disque. Je veux cela parce que les données que je télécharge doivent être rechargées quand la balise expires dans l'en-tête http est remplie, pas plus tôt. En outre, je souhaite que les utilisateurs d'iPod touch puissent télécharger les données une fois en ligne, puis les utiliser hors connexion.iphone: NSURLCache sur le disque

je fais ce qui fonctionne très bien pour les choses de mise en cache en mémoire, mais échoue lorsque relançant l'application:

NSURLRequest* menuRequest = [NSURLRequest requestWithURL:mensaURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval: 10]; 
NSCachedURLResponse* cachedMenuResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:menuRequest]; 
if (cachedMenuResponse) { 
    // received data is a member of that class to which the asynchronous 
    // download writes and which is then being used in updateDataFromDownload 
    // to retrieve my data structure from the download. 
    self.receivedData = [NSMutableData dataWithData:[cachedMenuResponse data]]; 
    [self updateDataFromDownload]; 
    NSLog(@"using data from cache"); 
} else { 
    NSLog(@"opening connection"); 
    [NSURLConnection connectionWithRequest:menuRequest delegate:self]; 
} 

Répondre

5

AFAIK NSURLRequest/NSURLConnection mise en cache de support sur le disque d'iOS 5.

MISE À JOUR : @Rob indique correctement dans les commentaires:

J'ai trouvé que si (a) vous utilisez le NSURLRequest cachePolicy par défaut de NSURLRequestUseProtocolCachePolicy; et (b) la réponse n'inclut pas l'en-tête Cache-Control, elle ne sera pas mise en cache sur le disque. Si vous utilisez un cachePolicy de NSURLRequestReturnCacheDataElseLoad ou si la réponse du serveur spécifie un en-tête Cache-Control particulier (par exemple, public, max-age = 1835400), il sera mis en mémoire cache sur le stockage persistant.

+0

la documentation dit qu'il fait, ou du moins implique que lorsque des méthodes permettant de définir la capacité de disque utilisé par le cache. – SmokeDispenser

+1

Oui, je sais. Je pense toujours que ce n'est pas supporté. Voir https://devforums.apple.com/message/182443#182443 et http://github.com/rs/SDURLCache, par exemple. –

+0

Merci pour cela. SDURLCache offre un moyen facile de faire exactement ce que je veux :) – SmokeDispenser

3

SDURLCache est une grande sous-classe de NSURLCache pour la mise en cache sur disque, performances très concentré.

Hope this helps, Vincent

+0

C'est une excellente bibliothèque à utiliser, même si j'entends que iOS 5.0+ a fixé NSURLCache pour fonctionner correctement sur le disque maintenant. SDURLCache est bon si vous avez besoin de plus de contrôle. – Biclops

Questions connexes