NSURLCache Проблема с ответом кеша - PullRequest
3 голосов
/ 26 февраля 2010

Я пишу приложение для iPhone, одна из его вкладок - твиттер, я разбираю твиттер xml и красиво помещаю его в табличное представление. Если нет подключения к Интернету, я бы хотел показать результаты кеша, когда в последний раз у нас было подключение к Интернету, и таблицы были обновлены. Я использую NSURLCache для этого так:

NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:xmlLink]
        cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:60];
NSURLCache *sharedCache = [NSURLCache sharedURLCache];

NSCachedURLResponse *response = [sharedCache cachedResponseForRequest:theRequest];

if (response) {
   NSLog(@"Got Response");
} else {
   NSLog(@"Didn't got Response");  
}
 self.objectFeedConnection = [[[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES] autorelease];

Я вижу, что NSLog впервые выдает «Не получил ответа», поскольку впервые посещает этот сайт (http://www.twitter.com/...) Я также вижу, что ответ кэшируется, так как я реализовал метод willCacheResponse, который вызывается после запуска initWithRequest, например:

 - (NSCachedURLResponse *) connection:(NSURLConnection *)connection 
   willCacheResponse:(NSCachedURLResponse *)cachedResponse
 {
    NSLog(@"willCache Reponse"); 
    NSCachedURLResponse *newCachedResponse = nil;    
    if ([[[[cachedResponse response] URL] scheme] isEqual:@"http"]) {
            newCachedResponse = [[[NSCachedURLResponse alloc]
            initWithResponse:[cachedResponse response]
            data:[cachedResponse data]
            userInfo:nil
            storagePolicy:[cachedResponse storagePolicy]]
            autorelease];
 }
     return newCachedResponse;
}

Во второй раз, когда я захожу на этот сайт, я ясно вижу, что NSLog выводит «Got Response», что означает, что произошел удар в кеше, поэтому willCacheResponse должен не вызываться снова, но по какой-то странной причине вызывается снова и снова и не извлекает информацию из кэша, вместо этого он пытается снова ее кэшировать.

Есть идеи, что вызвало эту проблему?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 15 июля 2011

OP, вероятно, больше не волнует, но для всех, кто играет с этим - вы должны посмотреть на HTTP-заголовки, возвращаемые в ответе. NSURLCache проверит заголовки, чтобы решить, может ли он использовать вещь, возвращенную из кэша. Контроль кэша: Последнее изменение: Etag: и т. Д.

2 голосов
/ 19 июля 2011

Пожалуйста, попробуйте эту библиотеку: https://github.com/rs/SDURLCache

0 голосов
/ 27 февраля 2010

Если я правильно понимаю ваш вопрос, то у меня была такая же проблема, и я никогда ее не решал: Использует ли NSURLConnection преимущества NSURLCache?

Насколько я могу судить, NSURLConnection просто не использует кеш, и вы должны сделать это самостоятельно, если хотите.

...