2012-01-20 9 views
8

Así que he subclasificado NSURLCache y cada vez que llamo a loadHTMLFromString: llama a storeCachedRequest:forRequest: y luego a cachedResponseForRequest:. Aquí es lo que tengo:NSURLCache no en caché

- (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]); 
} 

La cuestión es que cuando llamo cachedResponseForRequest: justo después de que se guarda, la respuesta es siempre nula. ¿Por qué es esto?

tuve:

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); 
} 

y siempre imprime la respuesta es nula. La cadena url es la misma que cuando storeCachedResponse. Por alguna razón, no es el almacenamiento en caché. Establecí el tamaño de la caché en una cantidad de tamaño.

Respuesta

1

No estoy 100% seguro, pero creo que debe usar el NSURLResponse que devolvió su NSURLConnection en lugar de crear el suyo. Mi sospecha es que si solo crea un NSURLResponse no tiene ningún encabezado configurado para el almacenamiento en caché, por lo que NSURLCache supone que debe almacenar en caché este resultado en particular.

+0

hmmm ... ¿estás seguro de eso? porque se llamó a storeCachedResponse justo antes de cachedResponseForRequest y response == nil en ese método – adit

+0

así que incluso si no estoy creando mi propia NSURLResponse, todavía no la guarda – adit

+0

"hmmm ... ¿estás seguro de eso?" Lee las primeras tres palabras de mi respuesta nuevamente. ;-) –

1

El NSURLCache predeterminado parece ser bastante aleatorio al elegir qué almacenar en caché o no. Su mejor opción puede ser subclasificarlo y manejar el almacenamiento en caché de los archivos que le importen directamente en cachedResponseForRequest: y dejar el resto para súper.

Cuestiones relacionadas