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

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

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


person Robert Atkins    schedule 30.06.2014    source источник


Ответы (3)


Если вы хотите пойти дальше, вы можете сбросить кешированный ответ для запроса 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 (принудительно), ответ никогда не будет возвращен при выполнении этого запроса.

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

person Felipe Jun    schedule 08.04.2016
comment
Из любопытства, это действительно сработало для вас? Я пытаюсь использовать этот метод ручного сброса кэшированного ответа с помощью Swift 2.2 на iOS 9.3. Однако выполнение NSURLCache.sharedCache().cachedResponseForRequest(...) по-прежнему возвращает кэшированный ответ. - person Clay Ellis; 03.08.2016
comment
@ClayEllis, последняя версия приложения работает под управлением 2.2 и отлично работает в производстве, хотя у меня больше нет доступа к коду. Вы устанавливаете заголовок управления кешем так, чтобы он имел нулевое время жизни? - person Felipe Jun; 03.08.2016
comment
Да, я делаю именно то, что вы сделали выше. Будет ли когда-либо NSURLCache возвращать кешированный ответ, даже если max-age установлено на ноль? - person Clay Ellis; 03.08.2016
comment
У меня это не работает (iOS 10.2) всегда возвращается кеш переопределения с пустыми данными - person benrudhart; 13.12.2016

Решение оказывается не в аннулировании кеша для существующего URL, а в установке:

request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;

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

person Robert Atkins    schedule 01.07.2014
comment
Будьте осторожны с другими параметрами: reloadIgnoringLocalAndRemoteCacheData и reloadRevalidatingCacheData никогда не следует использовать: они не реализованы Apple. - person Cœur; 05.11.2018

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

request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData

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

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

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

person Andrej    schedule 21.07.2016
comment
Будьте осторожны, чтобы reloadIgnoringLocalAndRemoteCacheData и reloadRevalidatingCacheData никогда не следует использовать: он не реализован компанией Apple. - person Cœur; 05.11.2018
comment
@Cœur Что ты имеешь в виду под нереализованным? Это не сработало для вас? Как вы думаете, это ошибка / вы сообщили об этом? Потому что ссылка четко определяет, как он должен себя вести: developer.apple.com/documentation/foundation/ нсурлрекуест/ - person Andrej; 05.11.2018
comment
Я конкретно говорю о двух конкретных случаях перечисления: перейдите по этим двум ссылкам и посмотрите документ для себя, он говорит: Важно Эта константа не реализована и не должна использоваться. - person Cœur; 05.11.2018