如何在带有结构化模型层的Siesta中实现持久性缓存

厌食症

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

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

此方法可以并且应该检查实体的内容和/或标题,如果不可编码,则将其忽略。尽管它们可以应用基于类型的规则,但是缓存实现不应应用基于资源基于url的规则。用于Resource.configure(...)选择要缓存哪些资源以及由谁缓存。

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

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

但是,由于EntityCache协议方法仅包含对Entity的引用(公开原始内容,但不包含类型化的对象),因此我看不到如何在调用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一旦您解决了所有选项,我建议您为任何建议的API改进提出Github问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Dart中如何实现持久性?

来自分类Dev

如何在带有NetworkManager和systemd的KDE桌面系统中设置持久性静态路由?

来自分类Dev

带有FBSDK的GraphRequest中的数据持久性

来自分类Dev

如何在持久性中列出所有数据

来自分类Dev

如何在Macbook中启动持久性Ubuntu 16.04?

来自分类Dev

如何在Luigi中创建非持久性任务?

来自分类Dev

Python中具有stdlib或最小依赖性的持久性多进程共享缓存

来自分类Dev

在DDD中具有独立的域模型和持久性模型

来自分类Dev

如何使用带有Rxjava的MVP进行结构化和改造以从Observables中获取数据?

来自分类Dev

持久性在nHibernate中如何工作

来自分类Dev

如果应该在持久层中实现该规则,该如何在域模型中表达该规则?

来自分类Dev

缓存或核心数据以实现半持久的图像和视频持久性?

来自分类Dev

如何为我的项目实现 Serializable 以具有持久性?

来自分类Dev

服务结构-有状态服务持久性

来自分类Dev

具有持久性的Laravel模拟模型

来自分类Dev

带有Docker和持久性存储的Elastic Beanstalk

来自分类Dev

带有共享套接字的持久性tmux会话

来自分类Dev

带有 JAVA 持久性 API ( JPA) 的 MongoDB

来自分类Dev

如何在python中处理结构化语言文件

来自分类Dev

如何在熊猫中读取非结构化的CSV

来自分类Dev

如何在numba中创建结构化标量列表?

来自分类Dev

如何在MVC中实现n层体系结构?

来自分类Dev

Firebase持久性,清除Firebase缓存

来自分类Dev

如何在没有持久性XML的情况下配置休眠属性

来自分类Dev

如何在Java持久性中的@NamedQuery中调用类似“ HOUR()”的SQL函数

来自分类Dev

如何在请求调用中添加持久性标头?

来自分类Dev

如何在MassTransit和Automatonymous中配置EF Core持久性?

来自分类Dev

如何在ckan中设置数据存储区以在列持久性模式下连接cygnus?

来自分类Dev

代号一-如何在持久性内存中存储JSON数据数组并回读

Related 相关文章

  1. 1

    在Dart中如何实现持久性?

  2. 2

    如何在带有NetworkManager和systemd的KDE桌面系统中设置持久性静态路由?

  3. 3

    带有FBSDK的GraphRequest中的数据持久性

  4. 4

    如何在持久性中列出所有数据

  5. 5

    如何在Macbook中启动持久性Ubuntu 16.04?

  6. 6

    如何在Luigi中创建非持久性任务?

  7. 7

    Python中具有stdlib或最小依赖性的持久性多进程共享缓存

  8. 8

    在DDD中具有独立的域模型和持久性模型

  9. 9

    如何使用带有Rxjava的MVP进行结构化和改造以从Observables中获取数据?

  10. 10

    持久性在nHibernate中如何工作

  11. 11

    如果应该在持久层中实现该规则,该如何在域模型中表达该规则?

  12. 12

    缓存或核心数据以实现半持久的图像和视频持久性?

  13. 13

    如何为我的项目实现 Serializable 以具有持久性?

  14. 14

    服务结构-有状态服务持久性

  15. 15

    具有持久性的Laravel模拟模型

  16. 16

    带有Docker和持久性存储的Elastic Beanstalk

  17. 17

    带有共享套接字的持久性tmux会话

  18. 18

    带有 JAVA 持久性 API ( JPA) 的 MongoDB

  19. 19

    如何在python中处理结构化语言文件

  20. 20

    如何在熊猫中读取非结构化的CSV

  21. 21

    如何在numba中创建结构化标量列表?

  22. 22

    如何在MVC中实现n层体系结构?

  23. 23

    Firebase持久性,清除Firebase缓存

  24. 24

    如何在没有持久性XML的情况下配置休眠属性

  25. 25

    如何在Java持久性中的@NamedQuery中调用类似“ HOUR()”的SQL函数

  26. 26

    如何在请求调用中添加持久性标头?

  27. 27

    如何在MassTransit和Automatonymous中配置EF Core持久性?

  28. 28

    如何在ckan中设置数据存储区以在列持久性模式下连接cygnus?

  29. 29

    代号一-如何在持久性内存中存储JSON数据数组并回读

热门标签

归档