2010-01-28 14 views
4

Je rencontre des problèmes lors de la mise en cache des réponses NSURLConnection à l'aide d'un appel synchrone. J'initialise le cache dans une classe et l'utilise ensuite dans une autre. Remarquez comment la capacité de la mémoire cache est initialisée à 100 Ko mais elle est réinitialisée à zéro par la suite.NSURLCache La taille de la mémoire est zéro

- (id)init { 
    if (self = [super init]) { 
     // Creates a custom URL cache that uses both memory and disk. 
     NSURLCache *sharedCache = 
     [[NSURLCache alloc] initWithMemoryCapacity:kMemoryCacheSize * 1000000 
     diskCapacity:kDiskCacheSize * 1000000 
     diskPath:diskPath]; 
     [NSURLCache setSharedURLCache:sharedCache]; 

     NSLog(@"Cache memory capacity = %d bytes", [[NSURLCache sharedURLCache] memoryCapacity]); 
     NSLog(@"Cache disk capacity = %d bytes", [[NSURLCache sharedURLCache] diskCapacity]); 

     //[sharedCache release]; 
    } 
    return self; 
} 
// NSLOG OUTPUT: 
// [6842:20b] Cache memory capacity = 100000 bytes 
// [6842:20b] Cache disk capacity = 20000000 bytes 

Dans une autre classe ...

NSLog(@"Cache memory capacity = %d bytes", [[NSURLCache sharedURLCache] memoryCapacity]); 
NSLog(@"Cache disk capacity = %d bytes", [[NSURLCache sharedURLCache] diskCapacity]); 
NSLog(@"Cache Memory Usage = %d bytes", [[NSURLCache sharedURLCache] currentMemoryUsage]); 
NSLog(@"Cache Disc Usage = %d bytes", [[NSURLCache sharedURLCache] currentDiskUsage]); 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:objectURL cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:20]; 
data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
NSLog(@"Image Request finished. Error = %@",[error localizedDescription]); 
NSLog(@"Cache size after = %d bytes", [[NSURLCache sharedURLCache] currentMemoryUsage]); 
// NSLog Output: 
// Cache memory capacity = 0 bytes 
// Cache Disc Usage = 0 bytes 
// Cache Memory Usage = 0 bytes 
// Cache disk capacity = 20000000 bytes 
// Image Request finished. Error = (null) 
// Cache size after = 0 bytes 

Répondre

1

J'ajouterais "% p" et [NSURLCache sharedURLCache] à vos déclarations NSLog pour vous assurer que l'objet partagé reste le même. Ensuite, je voudrais ajouter des points d'arrêt pour + [NSURLCache setSharedURLCache:] et - [NSURLCache setMemoryCapacity:] pour voir ce qui se passe.

4

J'ai eu ce problème dans les applications avec webviews. Pour une raison quelconque, lorsque les webviews s'initialisent, ils mettent à zéro le cache, je ne sais pas pourquoi. Dans des applications comme celle-ci, j'utilise une sous-classe NSURLCache qui ignore les appels à setMemoryCapacity: s'ils sont nuls.

quelque chose comme:

-(void)setMemoryCapacity:(NSUInteger)memCap 
{ 
    if (memCap == 0) 
     return; 
    [super setMemoryCapacity:memCap]; 
} 
0

eu le même problème ici. La mise en cache pensée ne fonctionne pas du tout. Après la mise en place d'un petit projet de test sans UIWebView, le [NSURLCache sharedURLCache] memoryCapacity] renvoie le 10000000 attendu au lieu de 0.

Heureusement, le cache ne sera pas effacé, tous resteront objets précédemment mises en cache. Donc la solution de Dougs fonctionne comme un charme! BTW: une fois qu'une vue Web est affichée, la taille sera mise à zéro. Si vous revenez à 10000000 par la suite, une vue Web ne redéfinit pas la taille à zéro.