Ios NSURLCache';s removeCachedResponseForRequest无效

Ios NSURLCache';s removeCachedResponseForRequest无效,ios,cocoa-touch,caching,afnetworking,nsurlrequest,Ios,Cocoa Touch,Caching,Afnetworking,Nsurlrequest,我创建了一个NSURLCache子类,它强制在指定的时间内缓存响应。这工作正常,缓存项按预期过期。但是,在尝试使用NSURLCache的removeCachedResponseForRequest:方法强制删除缓存响应时,我遇到了一些问题 我希望实现的是允许用户强制立即重新加载远程数据。为此,我在发出请求时传递一个“ignoreCache”标志。我将NSURLRequest构造为正常,但要求我的NSURLCache删除给定请求的所有以前缓存的响应。但是,这似乎没有任何效果,因为缓存的结果仍然存在

我创建了一个NSURLCache子类,它强制在指定的时间内缓存响应。这工作正常,缓存项按预期过期。但是,在尝试使用NSURLCache的
removeCachedResponseForRequest:
方法强制删除缓存响应时,我遇到了一些问题

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

关于NSURLCache的文档相当稀少。NSURLCache标头声明,传递给
removeCachedResponseForRequest:
的NSURLRequest用作查找关联NSCachedUrResponse对象的键,但对于该比较的逻辑,几乎没有给出任何信息。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子类中的Swift代码,以供参考:

// 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)
}

假设您使用的是iOS 8,
removeCachedResponseForRequest:
不起作用


请参见

播放一段时间后
removeCachedResponseForRequest
我意识到以下几点:1)如果您试图通过传递请求引用来删除缓存响应,则不会发生任何事情!2) 如果使用与要删除的参数相同的参数创建新的NSURLRequest,则将删除该请求。在iOS 8+上测试并运行。请尝试
NSURLCache()。removeCachedResponseForRequest(self.operationManager.requestSerializer.requestWithMethod(…)
Airsource Ltd,你能在iOS 9.3和iOS 10 Beta上确认这一行为吗?下个月没有机会,太忙了,但源代码在我的博客上。据报道,@mmackh在9.3/9.3.1中对我的回答发表了评论: