Swift 防止NSURLSession缓存响应

Swift 防止NSURLSession缓存响应,swift,caching,nsurlsession,nsurlcache,nsurlsessionconfiguration,Swift,Caching,Nsurlsession,Nsurlcache,Nsurlsessionconfiguration,它为什么缓存响应。它返回以前获取的响应。即使关闭网络连接,它也能工作。重置iOS模拟器似乎也不起作用。发出请求,然后再次使用internet脱机进行操作(缓存) 更新 我通过调用AppDelegate中的didfishLaunching中的代码来解决这个问题: func removeUrlCache() { NSURLCache.setSharedURLCache(NSURLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil))

它为什么缓存响应。它返回以前获取的响应。即使关闭网络连接,它也能工作。重置iOS模拟器似乎也不起作用。发出请求,然后再次使用internet脱机进行操作(缓存)

更新

我通过调用
AppDelegate
中的
didfishLaunching
中的代码来解决这个问题:

func removeUrlCache()
{
    NSURLCache.setSharedURLCache(NSURLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil))
}

然而,我仍然很好奇为什么我的原始代码不起作用。为解决我的问题而禁用所有应用程序的缓存也有点难看。

谢谢你的提问。这让我走上了正确的道路

NSURLCache.sharedURLCache()
有更多的可能性,您不需要为此更改内存容量和磁盘容量

您可以删除所有缓存的响应适合我。

URLCache.shared.removeAllCachedResponses()
let request = URLRequest(url: URL(string: url)!, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 10)
    URLCache.shared.removeCachedResponse(for: request)

//Do your request here
或者,您可以删除单个响应的缓存不适用于我的iOS 9。

URLCache.shared.removeAllCachedResponses()
let request = URLRequest(url: URL(string: url)!, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 10)
    URLCache.shared.removeCachedResponse(for: request)

//Do your request here
我希望它能帮助别人摆脱困境

编辑:
NSURLCache.sharedullcache().removeCachedResponseForRequest(request)
不幸地对我不起作用

我的另一个选择是:我用这个来拉刷新,并跟踪最后的更新日期。因此,我使用了以下代码:

 URLCache.shared.removeCachedResponses(since: lateUpdate)
但由于某些原因,这不起作用

自iOS 8以来,单缓存删除方法似乎已被破坏:


2019-05-24,更新为Swift 5。

不确定这是否真的可以防止摩擦,还是每次都强制重新加载,但这对我来说是有效的:

request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData
这里的屏幕截图显示了其他选项,以防有人需要它们:


我将实现urlsessionelegate,并在willCache委托实现中使用nil调用completionBlock。这是您的请求永远不会被更改的选项1 设置sessionConfig.URLCache=nil将禁用缓存

/* The URL resource cache, or nil to indicate that no caching is to be performed */
@property (nullable, retain) NSURLCache *URLCache;
这在后台会话中默认为零,因此默认情况下禁用缓存

参考:

选项2

实现以下委托方法并调用completionHandler(nil)将阻止缓存

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
                                  willCacheResponse:(NSCachedURLResponse *)proposedResponse 
                                  completionHandler:(void (^)(NSCachedURLResponse * _Nullable cachedResponse))completionHandler
请注意,此委托方法仅用于上载和数据任务,而不用于具有后台或临时配置的会话


参考:

谢谢!!您是否发现了更多信息?在创建
NSURLSessionConfiguration
对象时,将
configuration.URLCache
添加到
nil
,响应将不会被缓存。我使用了另一种方法来删除特定请求的缓存响应,重置缓存响应,看到我在这篇文章中的答案了吗?你们知道它在模拟器上的工作方式和在实际设备上的工作方式是否不同吗?我使用了这种方法,在模拟器上,即使在调用
applicationwillresignative
时删除所有缓存,仍然会保留完整的cache.db文件。我只在设备上测试过这一点。您可以尝试清理xCode缓存,这可能会在反仿真器中产生不同的结果(清理xCode缓存cmd+alt+shift+K)