gpt4 book ai didi

ios - 如何使用结构化模型层在 Siesta 中实现持久缓存

转载 作者:IT王子 更新时间:2023-10-29 05:43:27 24 4
gpt4 key购买 nike

我正在使用(并且喜欢)Siesta 与我的 Swift 应用程序中的 REST Web 服务进行通信。我已经实现了一系列 ResponseTransformer 来将 API 调用响应映射到模型类,以便 Siesta 资源自动解析为对象实例。这一切都很好。

我现在想实现一个 Siesta PersistantCache 对象来支持离线模式,方法是让 Siesta 将这些对象存储在 Realm 中,从而将它们缓存到磁盘(而不是内存中)。我不确定如何执行此操作,因为文档说(关于 EntityCache.writeEntity 函数):

This method can — and should — examine the entity’s content and/or headers and ignore it if it is not encodable. While they can apply type-based rules, however, cache implementations should not apply resource-based or url-based rules; use Resource.configure(...) to select which resources are cached and by whom.

为了符合这个指南,我在服务配置期间基于 URL 模式匹配为每个资源类型创建了一个特定的 PersistentCache 对象:

class _GFSFAPI: Service {
private init() {
configure("/Challenge/*") { $0.config.persistentCache = SiestaRealmChallengeCache() }
}

但是,由于 EntityCache 协议(protocol)方法只包括对实体的引用(它公开原始内容而不是类型化对象),我看不到在调用 EntityCache.writeEntity 或如何在 EntityCache.readEntity 期间将对象从 Realm 中拉出。

如有任何关于如何解决此问题的建议,我们将不胜感激。

最佳答案

好问题。为每个模型使用单独的 EntityCache 实现当然可以,尽管创建所有这些小的粘合类似乎很麻烦。

缓存中的模型

您的 writeEntity() 会被调用,无论您的所有响应转换器的末尾 出现什么。如果您的转换器配置为吐出模型类,则 writeEntity() 会看到模型。如果这些模型是 Realm 友好模型,那么,我看不出有任何理由不能调用 realm.add(entity.content)。 (如果这给您带来了问题,请通过问题的更新告诉我。)

相反,当从缓存中读取时,readEntity() 返回的内容不会再次通过转换器管道,因此它应该返回与您的转换器产生的完全相同的内容,即模型。

缓存查找键

您从文档中引用的特定段落写得不好,可能有点误导。当它说你“不应该应用基于资源或基于 url 的规则”时,它实际上只是试图阻止你解析 forKey: 参数——它实际上只是一个 URL,但应该保持不透明缓存实现。但是,您可以从给定的实体收集任何信息,包括 entity.content 的类型。

当前 API 下的一个问题——而且是一个严重的问题——是您需要保留从 Siesta 的键(您应该将其视为不透明)到不同类型的 Realm 对象的映射。您可以通过以下方式执行此操作:

  1. 保持 Realm 模型专用于保持从 Siesta 缓存键到各种类型的 Realm 对象的多态映射,
  2. 通过添加一个 siestaKey 属性并进行某种跨模型的联合查询,或者
  3. 通过在 Realm 之外保留(缓存键)→(模型类型、模型 ID)映射。

我可能会按此顺序继续这些选项,但我相信您在此处使用 Realm 作为 EntityCache 的支持处于相对未开发(尽管完全合理)的 Realm 。一旦您确定了选项,我鼓励您提交 Github 问题以获取任何建议的 API 改进。

关于ios - 如何使用结构化模型层在 Siesta 中实现持久缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33584629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com