Как сделать недействительным кеш 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