是否可以指定缓存策略?

Is it possible to specify a cache policy?

是否可以在 Siesta 中使用像这样的缓存策略:

其中LocalOnly是只从本地缓存获取数据,而NetworkFirst是从网络获取数据,如果失败,从本地缓存中检索。

是的,您可以使用 URLSessionConfiguration

let configuration = URLSessionConfiguration.default
    configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders

// cache policy
configuration.requestCachePolicy = .reloadIgnoringLocalCacheData

缓存策略是在 NSURLRequest 中定义的枚举,我相信您可以在那里找到您正在寻找的选项。

对于 localOnly 选项,您可以使用:.returnCacheDataDontLoad

对于 networkFirst 选项,也许选项 .reloadIgnoringLocalCacheData 会很适合你

@nikano 的答案是正确的,如果你想在将它用作 Siesta 的底层网络库时控制 URLSession 的缓存行为。

一般来说,Siesta 让底层网络做它的事情。即使将它与 Siesta 一起使用,对 URLSession 有效的选项也保持不变。


Siesta 本身 是一个可观察的 in-memory 缓存。它的核心设计功能之一是,它让您 fine-grained 控制您看到的数据,缓存的或新鲜的——这至关重要,这不是一个 either/or 问题。您可以同时使用两者。

如果您想查看本地缓存在内存中的数据,您的“仅限本地”,只需请求资源即可:

resource.latestData

如果你想要强制网络请求,即使有缓存数据,即你的“仅限网络:”

resource.load().onSuccess { ...use the data... }

…如果出于某种原因你想请求 up-to-date 数据但 没有 让 Siesta 缓存它:

resource.request(.get).onSuccess { ... }

然而,最常见的习惯用法是同时使用缓存数据和新数据:

resource.addObserver(somethingObserverThatUsesTheData)
resource.loadIfNeeded()

在那种情况下,somethingObserverThatUsesTheData首先查看本地缓存的数据(如果有),然后查看从网络库返回的数据(如果有网络请求)。


请注意,从网络库返回的数据本身可能已被缓存。在大多数情况下,我建议禁用 URLSession 的缓存,以便您知道您正在获取 up-to-date 数据。但是,在某些情况下,拥有两层缓存可能是正确的选择。