Как сделать недействительным кеш iOS для определенного URL?

С помощью NSURLSessionкэширование по умолчанию, как сделать недействительным кеш для определенного URL?

я заметил NSURLCache"s removeCachedResponseForRequest: метод, но это требует NSURLRequest объект, которого у меня нет по исходному запросу. Нужно ли хранить их по мере их создания, чтобы затем я мог передать их обратно в removeCachedResponseForRequest: или я могу просто создать новый с соответствующим URL, который затем будет использоваться в качестве эквивалента для этой цели, даже если у него нет тех же полей заголовка и других свойств, что и у оригинала?

3 ответа

Решение

Решение оказывается не в том, чтобы сделать кеш для существующего URL недействительным, а в том, чтобы установить:

request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;

Когда вы делаете следующий запрос на ресурс, который вы знаете, будет недействительным. Существуют варианты игнорирования только локального кэша или запроса, чтобы вышестоящие прокси также игнорировали свои кэши. См. NSURLRequest/ NSMutableURLRequest документацию для деталей.

Если вы хотите пойти дальше, вы можете сбросить кэшированный ответ для URL-запроса, который вы хотите принудительно перезагрузить. Делать следующее:

let newResponse = NSHTTPURLResponse(URL: urlrequest.URL!, statusCode: 200, HTTPVersion: "1.1", headerFields: ["Cache-Control":"max-age=0"])
let cachedResponse = NSCachedURLResponse(response: newResponse!, data: NSData())
NSURLCache.sharedURLCache().storeCachedResponse(cachedResponse, forRequest: urlrequest)

Поскольку заголовок контроля кэша ответа имеет максимальный возраст 0 (принудительный), ответ никогда не будет возвращен при выполнении этого запроса.

Ваш ответ хорошо работает для форсирования одного запроса, но если вы хотите иметь две версии запроса, одну для форсирования, а другую полагаться на кэшированный ответ, удалите кэшированную, как только вы принудительно запросите запрос.

Вот что работает для меня:

request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData

Вот все варианты, перечисленные в отношении политики chache, поэтому вы можете найти тот, который лучше соответствует вашим потребностям:

введите описание изображения здесь

Использование Swift 2.2 и Xcode 7.3

Другие вопросы по тегам