2014-08-31 95 views
3

我创建了一个NSURLCache子类,它强制缓存响应达指定的时间量。这是行之有效的,并且缓存项目按预期过期。然而,当我尝试使用NSURLCache的removeCachedResponseForRequest:方法强制删除缓存的响应时,我遇到了一些问题。NSURLCache的removeCachedResponseForRequest没有效果

我期待的是让用户强制立即重新加载远程数据。为此,我在发出请求时传递“ignoreCache”标志。我正常构造我的NSURLRequest,但要求我的NSURLCache为给定的请求删除任何先前缓存的响应。但是,这似乎没有任何效果,因为缓存的结果仍然存在并且在执行请求时使用。

围绕NSURLCache的文档相当稀少。 NSURLCache标头指出,传递给removeCachedResponseForRequest:的NSURLRequest被用作查找关联的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) 
} 

下面是从我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+。 – 2016-07-19 14:25:49

+0

尝试使用'NSURLCache()。removeCachedResponseForRequest(self.operationManager.requestSerializer.requestWithMethod(...)' – 2016-07-19 14:31:51

回答

6

假设你是在iOS 8,removeCachedResponseForRequest:不起作用。

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

+0

Airsource Ltd,你能否在iOS 9.3和iOS 10 beta版上确认这种行为? – 2016-08-02 20:22:30

+0

下个月没有机会,太忙了,但是源代码在我的博客上,它在9.3/9.3.1中被@mmackh在我的回答的评论中报告为破坏:http://stackoverflow.com/questions/26260401/nsurlcache-does-not-clear-stored -responses功能于iOS8上/ 26343653#26343653 – 2016-08-02 20:25:45