2017-06-17 51 views
0

我正在使用下面的代码通过URLConfiguration来设置我的URLSession的缓存策略。如何清除URLSession/URLConfiguration存储的缓存数据?

if appDelegateObj.configuration == nil { 
      appDelegateObj.configuration = URLSessionConfiguration.default 
    } 

if self.apiType == ServerRequest.API_TYPES_NAME.API1 { 


    if appDelegateObj.forceReload == true { 
     appDelegateObj.configuration?.urlCache = nil 
     appDelegateObj.configuration?.requestCachePolicy = .reloadIgnoringLocalCacheData 

    }else{ 
     appDelegateObj.configuration?.requestCachePolicy = .returnCacheDataElseLoad 
    } 


}else{ 
    appDelegateObj.configuration?.requestCachePolicy = .reloadIgnoringLocalCacheData 
} 
session = URLSession(configuration: appDelegateObj.configuration!, delegate: nil, delegateQueue: nil) 

我遇到的问题是,我甚至设置

appDelegateObj.configuration?.urlCache = nil 

我能够得到新鲜的数据的唯一方法后,通过使用

appDelegateObj.configuration?.requestCachePolicy = .reloadIgnoringLocalCacheData 
获取缓存的响应背面

我做错了什么?我需要一种方法来清除应用程序的所有缓存数据。

我一直在使用

URLCache.shared.removeAllCachedResponses() 

尝试,但同样是行不通的。

回答

1

几点:

  • 设置URL缓存为nil不会禁用所有缓存。用户仍然可以从代理获取缓存数据。
  • 清除缓存并不保证是即时的。 IIRC,它滞后了几秒钟。
  • 即使是即时的,用户仍然可以从代理获取缓存数据。

总之,设置reloadIgnoringLocalCacheData是正确的方式来做你正在做的事情(嗯,真的,​​)。

但是,除非你想支持一些奇怪的离线模式下,你可能不要使用returnCacheDataElseLoad。该模式会忽略服务器提供的缓存过期,您几乎肯定不希望这样做。改用默认策略(useProtocolCachePolicy)。

+0

嗨,所以基本上我无法控制一次缓存的数据/ resp。我无法清除特定网址的缓存。对 ?我需要更改策略才能达到/克服特定URL的缓存数据? –

+0

您可以在本地清除它,但不能保证它会在以后立即被清除。可能需要几秒钟才能异步传播到磁盘上的缓存。并且无法清除任何上游缓存(例如在代理服务器上)。避免代理缓存请求的唯一方法是使用“忽略本地和远程缓存数据”模式,该模式会发送额外的头文件来告诉(正常运行的)缓存忽略缓存的数据。 – dgatwood

+0

感谢您的澄清。我很惊讶地知道这个事实。真的很感谢帮助! –