2010-02-25 3 views
3

Je suis en train d'écrire une application iPhone, l'un de ses onglets est un flux twitter, je suis en train d'analyser twitter xml et de le mettre joliment dans une vue de table. Dans le cas où il n'y a pas de connexion Internet, je voudrais montrer les résultats de cache de la dernière fois que nous avions une connexion Internet et les tables ont été mises à jour. J'utilise pour cela NSURLCache comme ceci:NSURLCache Problème avec la réponse du cache

NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:xmlLink] 
     cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:60]; 
NSURLCache *sharedCache = [NSURLCache sharedURLCache]; 

NSCachedURLResponse *response = [sharedCache cachedResponseForRequest:theRequest]; 

if (response) { 
    NSLog(@"Got Response"); 
} else { 
    NSLog(@"Didn't got Response"); 
} 
self.objectFeedConnection = [[[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES] autorelease]; 

je peux voir que pour la première fois sorties NSLog « n'a reçu une réponse » car il est la première fois visiter ce site je peux (http://www.twitter.com/...) voir aussi que la réponse est mise en mémoire cache, depuis que je mis en œuvre la méthode willCacheResponse qui est appelé après la initWithRequest a été lancé, comme ceci:

- (NSCachedURLResponse *) connection:(NSURLConnection *)connection 
    willCacheResponse:(NSCachedURLResponse *)cachedResponse 
{ 
    NSLog(@"willCache Reponse"); 
    NSCachedURLResponse *newCachedResponse = nil;  
    if ([[[[cachedResponse response] URL] scheme] isEqual:@"http"]) { 
      newCachedResponse = [[[NSCachedURLResponse alloc] 
      initWithResponse:[cachedResponse response] 
      data:[cachedResponse data] 
      userInfo:nil 
      storagePolicy:[cachedResponse storagePolicy]] 
      autorelease]; 
} 
    return newCachedResponse; 
} 

la deuxième fois que je visite ce site je peux voir clairement que les sorties NSLog " Got Response ", ce qui signifie qu'il y a eu un cache, donc willCacheResponse s hould pas appelé, mais pour une raison étrange, il est appelé encore et encore et ne tire pas les informations hors du cache, à la place, il essaie de le mettre en cache à nouveau.

Une idée de ce qui cause ce problème?

Merci!

+0

J'ai essayé toutes sortes de politiques. Fondamentalement, j'ai besoin d'utiliser NSURLRequestUseProtocolCachePolicy, toujours charger à distance s'il y a une connexion Internet, sinon charger à partir du cache, mais les deux me donnent le même problème. – djTeller

Répondre

0

Si je comprends bien votre question, alors j'eu le même problème et n'a jamais résolu le problème: Does NSURLConnection take advantage of NSURLCache?

Pour autant que je peux dire, NSURLConnection ne fonctionne tout simplement pas profiter du cache, et vous devez fais-le toi-même si tu le veux.

+0

C'est exactement mon problème, il semble que c'est seulement la mise en cache de l'URL de réponse pas ses données, donc au cas où je veux l'utiliser, je peux vérifier que j'ai déjà visité un site spécifique. J'ai effectivement travaillé toute la journée hier pour implémenter le cache en utilisant NSKeyedArchive, j'utilise le NSURLCache au début juste comme une indication que j'ai caché ce site, si la réponse est non je le cache, si la réponse est oui je le retire de l'Archive. Ils devraient rendre la documentation sur ce sujet un peu plus claire, et ajouter quelques exemples. – djTeller

2

OP ne s'en soucie probablement plus, mais pour quiconque joue avec ceci - Vous devriez regarder les en-têtes HTTP qui sont retournés dans la réponse. NSURLCache vérifiera les en-têtes pour décider s'il peut utiliser la chose retournée du cache. Cache-Control: Last-Modified: Etag: etc.

Questions connexes