2014-08-31 1 views
3

Я создал подкласс 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) 
} 
+0

Поиграв некоторое время 'removeCachedResponseForRequest' я понял следующее: 1) При попытке удалить кэшированный ответ, передавая ссылку на запрос, ничего не будет! 2) Если вы создаете новый NSURLRequest с теми же параметрами, что и тот, который хотите удалить, запрос будет удален. Протестировано и работает на iOS 8+. –

+0

Попробуйте 'NSURLCache(). RemoveCachedResponseForRequest (self.operationManager.requestSerializer.requestWithMethod (...)' –

ответ

6

Предполагая, что вы на прошивке 8, removeCachedResponseForRequest: не работает.

http://blog.airsource.co.uk/2014/10/13/nsurlcache-ios8-broken-2/ См

+0

Airsource Ltd, вы можете подтвердить это поведение на iOS 9.3 и iOS 10 бета? –

+0

В следующем месяце нет шансов, слишком занят, но исходный код находится в моем блоге. Сообщалось, что в 9.3/9.3.1 @mmackh было опубликовано сообщение о моем ответе здесь: http://stackoverflow.com/questions/26260401/nsurlcache-does-not-clear-stored -responses-в-ios8/26343653 # 26343653 –

 Смежные вопросы

  • Нет связанных вопросов^_^