NSURLCache не кеширует - PullRequest
       10

NSURLCache не кеширует

8 голосов
/ 20 января 2012

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

- (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. По какой-то причине это не кеширование. Я установил размер кэша равным некоторому размеру.

Ответы [ 2 ]

1 голос
/ 26 ноября 2012

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

1 голос
/ 20 января 2012

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

...