#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];
Для того, чтобы кэш учитывал информацию заголовков.
Надеюсь, это поможет.