2012-01-20 1 views
8

Так что я подклассифицировал NSURLCache и каждый раз, когда я звоню loadHTMLFromString:, он вызывает storeCachedRequest:forRequest:, а затем cachedResponseForRequest:. Вот что у меня есть:NSURLCache не кэширование

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

Вопрос заключается в том, что, когда я называю cachedResponseForRequest: сразу после того, сохраняется, ответ всегда ноль. Почему это?

Я имел:

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

и он всегда печатает ответ равен нулю. Строка url такая же, как и когда storeCachedResponse. По какой-то причине это не кеширование. Я установил размер кеша в некоторый размер.

ответ

1

Не уверен на 100%, но я думаю, вам нужно использовать NSURLResponse, который был возвращен вашим NSURLConnection вместо того, чтобы создавать свои собственные. Мое подозрение состоит в том, что если вы просто создаете, то у него нет заголовков для кеширования, поэтому NSURLCache предполагает, что он должен кэшировать этот конкретный результат.

+0

Хммм ... вы в этом уверены? потому что storeCachedResponse был вызван непосредственно перед cachedResponseForRequest и response == nil в этом методе – adit

+0

, поэтому, даже если я не создаю свой собственный NSURLResponse, он все равно не сохраняет его – adit

+0

«Хммм ... вы уверены в этом?» Прочтите первые три слова моего ответа еще раз. ;-) –

1

По умолчанию NSURLCache, по-видимому, довольно случайен при выборе кеша или нет. Лучше всего подклассифицировать его и обработать кэширование файлов, которые вы имеете в виду непосредственно в cachedResponseForRequest, и оставить остальное для супер.