2012-01-20 3 views
8

Quindi ho sottoclasse NSURLCache e ogni volta che chiamo loadHTMLFromString: chiama storeCachedRequest:forRequest: e quindi cachedResponseForRequest:. Ecco quello che ho:NSURLCache non memorizza nella cache

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request 
{ 
    NSString *pathString = [[request URL] absoluteString]; 

    NSCachedURLResponse * response = [super cachedResponseForRequest:request]; 
    if (response != nil) 
     return response; 
    else { 
     NSString* myString= @"testing"; 

     NSData* data=[myString dataUsingEncoding: NSASCIIStringEncoding ]; 

     // 
     // Create the cacheable response 
     // 
     NSURLResponse *response = 
     [[[NSURLResponse alloc] 
      initWithURL:[request URL] 
      MIMEType:[self mimeTypeForPath:pathString] 
      expectedContentLength:[data length] 
      textEncodingName:nil] 
     autorelease]; 
     NSCachedURLResponse * cachedResponse = 
     [[[NSCachedURLResponse alloc] initWithResponse:response data:data] autorelease]; 

     [self storeCachedResponse:cachedResponse forRequest:request] ; 

     //NSLog(@"DEFAULT CACHE WITH URL %@", [[request URL] absoluteString]); 
     return [super cachedResponseForRequest:request]; 
    } 

    return nil; 
} 

- (void)storeCachedResponse:(NSCachedURLResponse *)cachedResponse forRequest:(NSURLRequest *)request 
{ 
    [super storeCachedResponse:cachedResponse forRequest:request]; 

    NSLog(@"STORE CACHED RESPONSE WITH URL %@", [[request URL] absoluteString]); 
} 

Il problema è che quando chiamo cachedResponseForRequest: subito dopo viene salvato, la risposta è sempre pari a zero. Perchè è questo?

ho avuto:

NSURLRequest * req = [NSURLRequest requestWithURL:[NSURL URLWithString:self.imageSource_]]; 
NSCachedURLResponse * response = [[NSURLCache sharedURLCache] cachedResponseForRequest:req]; 

if (response == nil) 
    NSLog(@"RESPONSE IS NIL"); 
else { 
    NSString* theString = [[NSString alloc] initWithData:response.data encoding:NSASCIIStringEncoding]; 
    NSLog(@"RESPONSE IS NOT NIL %@", theString); 
} 

e la stampa sempre la risposta è pari a zero. La stringa dell'URL è la stessa di quando era storeCachedResponse. Per qualche ragione non è il caching. Ho impostato la dimensione della cache su una certa dimensione.

risposta

1

Non sicuro al 100%, ma penso che sia necessario utilizzare lo NSURLResponse restituito dal proprio NSURLConnection anziché crearne uno proprio. Il mio sospetto è che se si crea solo un NSURLResponse non ha alcuna intestazione impostata per la memorizzazione nella cache, e quindi NSURLCache presuppone che dovrebbe memorizzare nella cache questo particolare risultato.

+0

hmmm ... ne sei sicuro? perché storeCachedResponse è stato chiamato subito prima di cachedResponseForRequest e response == nil in quel metodo – adit

+0

quindi, anche se non sto creando il mio NSURLResponse, non lo salva ancora – adit

+0

"hmmm ... ne sei sicuro?" Leggi di nuovo le prime tre parole della mia risposta. ;-) –

1

Il NSURLCache predefinito sembra essere piuttosto casuale quando si sceglie cosa memorizzare nella cache o meno. La soluzione migliore potrebbe essere quella di sottoclasse e gestire la memorizzazione nella cache dei file che ti interessa direttamente in cacheResponseForRequest: e lasciando il resto per super.