Почему всегда используются кэшированные данные ASIDownloadCache?

#objective-c #asihttprequest

#objective-c #asihttprequest

Вопрос:

Я использую ASIDownloadCache для кэширования загружаемых файлов, приведенный ниже код показывает, как я настраиваю запрос и downloadcache. `request = [super initWithURL:url1]; [время установки запроса: 50 секунд];

 ASIDownloadCache *cache = [[ASIDownloadCache alloc] init] ;
[cache setStoragePath:[path stringByAppendingPathComponent:@"resource"]];
[cache setShouldRespectCacheControlHeaders:NO];

self.myCache = cache;    
[cache release];
[request setDownloadCache:self.myCache];   
//[self setSecondsToCache:60*60*24*30];
[request setCachePolicy:ASIAskServerIfModifiedCachePolicy];
[request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
  

`
Моя проблема в том, что когда заголовок URL был изменен, ASIDownloadCache все еще использует кэшированные данные. Почему? Кто-нибудь знает ответ?

Заголовок этого URL-адреса перед изменением выглядит следующим образом:

HTTP/1.1 200 OK Сервер: Apache /2.2 Cache-Control: общедоступный тип содержимого: текст / html; кодировка= UTF-8 Дата: Пн, 07 нояб. 2011 г. 08:26:15 GMT Срок действия: Пн, 07 нояб. 2011 г. 08:23:35 GMT Pragma: общедоступная передача-Кодировка: фрагментированный Etag: 1320654215 Соединение: Поддерживается Последнее изменение: Пн, 07 нояб. 2011 г. 08:23:35 GMT

Заголовок после изменения выглядит следующим образом:

HTTP/1.1 200 OK Сервер: Apache /2.2 Cache-Control: общедоступный тип содержимого: текст / html; кодировка = UTF-8 Дата: Пн, 07 ноя 2011 08:28:49 GMT Истекает: Пн, 07 ноя 2011 08:28:32 GMT Pragma: общедоступная передача-Кодировка: фрагментированный Etag: 1320654512 Соединение: Постоянно Последнее изменение: Пн, 07 ноя 2011 08:28:32 GMT

Даже поля с последними изменениями не совпадают, он все еще использует кэшированные данные.

Комментарии:

1. Используйте charlesproxy или аналогичный, чтобы перехватить запрос, отправляемый ASIHTTPRequest, и ответ с сервера, и добавьте это в свой вопрос.

2. Заголовки перечислены, есть ли что-то не так с заголовком?

3. Они выглядят нормально; я думаю, вам нужно пройтись по коду и понять, почему он решает использовать кэшированные данные. точка останова в readResponseHeaders и пошаговое выполнение canUseCachedDataForRequest

4. Я думаю, что нахожу проблему, когда я получаю заголовок, запрос не завершен. Несмотря на то, что заголовки отличаются, он также проверит, был ли выполнен запрос. Поэтому я думаю, что я должен написать свое собственное кэширование. Спасибо @JosephH.

Ответ №1:

Я думаю, что мне нравится проблема. Когда я получаю заголовок, запрос не завершен. Даже если заголовки отличаются, он также проверит, был ли выполнен запрос. Поэтому я думаю, что я должен написать свое собственное кэширование.

Ответ №2:

Ответ содержится в вопросе :

 [cache setShouldRespectCacheControlHeaders:NO];
  

Вы должны использовать

 [cache setShouldRespectCacheControlHeaders:YES];
  

Для того, чтобы кэш учитывал информацию заголовков.

Надеюсь, это поможет.