如何使用结构化模型层

时间:2015-11-07 15:53:02

标签: ios swift realm siesta-swift

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

我现在希望通过将这些对象存储到磁盘(而不是在内存中)将它们存储在Realm中来实现Siesta PersistantCache对象以支持脱机模式。我不知道如何做到这一点,因为文档说(关于EntityCache.writeEntity函数):

  

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

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

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

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

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

1 个答案:

答案 0 :(得分:7)

很好的问题。对每个模型单独的EntityCache实现肯定可以工作,尽管创建所有这些小胶水类似乎很麻烦。

缓存中的模型

您的所有响应变换器的 end 都会调用writeEntity()。如果您的变换器配置为吐出模型类,那么writeEntity()会看到模型。如果这些模型是对领域友好的模型,那么,我认为你没有任何理由不能只调用realm.add(entity.content)。 (如果这给你带来了问题,请通过更新问题告诉我。)

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

缓存查找键

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

当前API下的一个皱纹 - 它是一个严重的皱纹 - 是你需要保持从Siesta的键(你应该视为不透明)到不同类型的Realm对象的映射。你可以这样做:

  1. 保持Realm模型专用于保持从Siesta缓存键到各种类型的Realm对象的多态映射,
  2. 添加siestaKey属性并在模型之间进行某种联合查询,或
  3. 将(缓存键)→(模型类型,型号ID)映射保留在Realm之外。
  4. 我可能会按顺序追求选项,但我相信你在使用Realm作为EntityCache的支持时处于相对未开发的(尽管非常合理)领域。一旦您确定了选项,我建议您为任何建议的API改进提交Github问题。