Я создал подкласс NSURLCache, который заставляет кэшировать ответы в течение определенного времени. Это работает хорошо, и кешированные элементы истекли, как ожидалось. Однако я сталкиваюсь с проблемами при попытке принудительно удалить кешированный ответ, используя метод NSURLCache removeCachedResponseForRequest:
.Удаление NSURLCacheCachedResponseForRequest не имеет эффекта
Я хочу добиться того, чтобы пользователи могли принудительно перезагрузить удаленные данные. Чтобы сделать это, я передаю флаг «ignoreCache» при выполнении запроса. Я строю свой NSURLRequest как обычно, но попрошу NSURLCache удалить любые ранее кэшированные ответы для данного запроса. Однако это не имеет никакого эффекта, поскольку кешированный результат все еще присутствует и используется, когда запрос выполняется.
Документация вокруг NSURLCache довольно редкая. В заголовках NSURLCache указано, что NSURLRequest, переданный в removeCachedResponseForRequest:
, используется в качестве ключа для поиска связанного с ним объекта NSCachedURLResponse, но информации относительно этого сравнения мало. Предполагается ли, что класс NSURLCache получит тот же экземпляр NSURLRequest, который сгенерировал кешированный ответ, или просто сопоставляет NSURL, который он представляет?
Надеюсь, кто-то может указать мне в правильном направлении.
var error: NSError? = nil
var URLRequest: NSMutableURLRequest = self.operationManager.requestSerializer.requestWithMethod("GET", URLString: NSURL(string: request.URL, relativeToURL: self.operationManager.baseURL).absoluteString, parameters: request.parameters, error: &error)
URLRequest.cachePolicy = NSURLRequestCachePolicy.ReturnCacheDataElseLoad
// We've been asked to ignore the cache, so remove our previously cached response
if ignoreCache == true {
NSURLCache.sharedURLCache().removeCachedResponseForRequest(URLRequest)
}
Вот Swift код из моего NSURLCache подкласса для справки:
// MARK: - NSURLCache
override func cachedResponseForRequest(request: NSURLRequest!) -> NSCachedURLResponse! {
var cachedResponse: NSCachedURLResponse? = super.cachedResponseForRequest(request)
if(cachedResponse != nil && cachedResponse!.userInfo != nil) {
var cacheDate: NSDate? = cachedResponse!.userInfo![self.cacheExpirationKey] as? NSDate
if(cacheDate != nil) {
var cacheDateLimit: NSDate = cacheDate!.dateByAddingTimeInterval(self.cacheExpirationInterval)
if(cacheDate!.compare(NSDate()) == NSComparisonResult.OrderedAscending) {
self.removeCachedResponseForRequest(request)
} else {
return cachedResponse
}
}
}
// Either our cached data was too old, or we don't have any that match the NSURLRequest
return nil
}
override func storeCachedResponse(cachedResponse: NSCachedURLResponse!, forRequest request: NSURLRequest!) {
var userInfo: NSMutableDictionary = NSMutableDictionary(dictionary: cachedResponse.userInfo)
userInfo[cacheExpirationKey] = NSDate().dateByAddingTimeInterval(self.cacheExpirationInterval)
var modifiedCacheResponse: NSCachedURLResponse = NSCachedURLResponse(response: cachedResponse.response, data: cachedResponse.data, userInfo: userInfo, storagePolicy: cachedResponse.storagePolicy)
super.storeCachedResponse(modifiedCacheResponse, forRequest: request)
}
Поиграв некоторое время 'removeCachedResponseForRequest' я понял следующее: 1) При попытке удалить кэшированный ответ, передавая ссылку на запрос, ничего не будет! 2) Если вы создаете новый NSURLRequest с теми же параметрами, что и тот, который хотите удалить, запрос будет удален. Протестировано и работает на iOS 8+. –
Попробуйте 'NSURLCache(). RemoveCachedResponseForRequest (self.operationManager.requestSerializer.requestWithMethod (...)' –