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

ann*_*rns 9 realm ios swift siesta-swift

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

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

此方法可以 - 并且应该 - 检查实体的内容和/或标头,如果它不可编码则忽略它.虽然它们可以应用基于类型的规则,但是缓存实现不应该应用基于资源基于URL的规则; 用于Resource.configure(...)选择缓存哪些资源以及由谁来缓存.

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

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

但是,由于EntityCache协议方法只包含对Entity的引用(它暴露原始内容而不是类型化对象),我看不出如何在调用EntityCache.writeEntity时调用realm write方法或如何提取EntityCache.readEntity期间Realm中的对象.

任何有关如何处理此问题的建议将不胜感激.

Pau*_*ell 7

好问题.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问题.