【问题标题】:How do I invalidate iOS's cache for a particular URL?如何使特定 URL 的 iOS 缓存失效?
【发布时间】:2014-08-20 22:24:10
【问题描述】:

使用NSURLSession 的默认缓存,如何使特定 URL 的缓存失效?

我注意到NSURLCacheremoveCachedResponseForRequest: 方法,但这需要一个NSURLRequest 对象,我没有原始请求。我是否需要在创建它们时存储它们,以便我可以将它们传递回removeCachedResponseForRequest:,或者我可以创建一个具有适当 URL 的新 URL,然后将其作为等效 URL,即使它没有与原始的标题字段和其他属性相同?

【问题讨论】:

    标签: ios caching nsurlsession nsurlcache


    【解决方案1】:

    如果您想更进一步,您可以为要强制重新加载的 url 请求重置缓存的响应。执行以下操作:

    let newResponse = NSHTTPURLResponse(URL: urlrequest.URL!, statusCode: 200, HTTPVersion: "1.1", headerFields: ["Cache-Control":"max-age=0"])
    let cachedResponse = NSCachedURLResponse(response: newResponse!, data: NSData())
    NSURLCache.sharedURLCache().storeCachedResponse(cachedResponse, forRequest: urlrequest)
    

    由于响应的缓存控制标头的最大年龄为 0(强制),因此在您执行此请求时将永远不会返回响应。

    您的答案适用于强制单个请求,但如果您希望有两个版本的请求,一个是强制的,另一个依赖于缓存的响应,则需要在强制请求后删除缓存的一个。

    【讨论】:

    • 出于好奇,这对您真的有用吗?我正在尝试使用这种在 iOS 9.3 上使用 Swift 2.2 手动重置缓存响应的方法。但是,NSURLCache.sharedCache().cachedResponseForRequest(...) 仍然会返回一个缓存的响应。
    • @ClayEllis 好吧,该应用程序的最后一个版本正在运行 2.2 并且在生产中运行良好,但我无法再访问代码了。您是否将缓存控制标头设置为零?
    • 是的,我正在做你上面所做的事情。即使max-age 设置为零,NSURLCache 还会返回缓存响应吗?
    • 这对我不起作用(iOS 10.2)总是返回带有空数据的覆盖缓存
    【解决方案2】:

    解决方案不是使现有 URL 的缓存失效,而是设置:

    request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;

    当您对您知道无效的资源发出下一个请求时。有一些选项可以只忽略本地缓存,或者请求上游代理也忽略它们的缓存。有关详细信息,请参阅NSURLRequest/NSMutableURLRequest 文档。

    【讨论】:

    【解决方案3】:

    以下是对我有用的:

    request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData
    

    这里列出了有关 chache 政策的所有选项,因此您可能会找到更适合您需要的选项:

    使用 Swift 2.2 和 Xcode 7.3

    【讨论】:

    猜你喜欢
    • 2019-06-09
    • 2018-12-05
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 2015-10-10
    • 2017-09-08
    • 1970-01-01
    相关资源
    最近更新 更多