我创建了一个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)
}
玩一段时间'removeCachedResponseForRequest'我来到后,实现了以下内容: 1)如果你试图通过传递参考请求删除缓存响应,什么都不会发生! 2)如果你创建了新的NSURLRequest,其参数和你想要删除的参数相同,这个请求将被删除。经过测试,适用于iOS 8+。 – 2016-07-19 14:25:49
尝试使用'NSURLCache()。removeCachedResponseForRequest(self.operationManager.requestSerializer.requestWithMethod(...)' – 2016-07-19 14:31:51