我正在使用(并且喜欢)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。
有关如何处理此问题的任何建议将不胜感激。
答案 0 :(得分:7)
很好的问题。对每个模型单独的EntityCache
实现肯定可以工作,尽管创建所有这些小胶水类似乎很麻烦。
您的所有响应变换器的 end 都会调用writeEntity()
。如果您的变换器配置为吐出模型类,那么writeEntity()
会看到模型。如果这些模型是对领域友好的模型,那么,我认为你没有任何理由不能只调用realm.add(entity.content)
。 (如果这给你带来了问题,请通过更新问题告诉我。)
相反,当从缓存中读取时,readEntity()
返回的内容不会再次通过变换器管道,因此它应该返回与变换器产生的完全相同的东西,即模型。
您从文档中引用的特定段落写得不好,可能有点误导。当它说你“不应该应用基于资源或基于网址的规则”时,它实际上只是试图阻止你解析forKey:
参数 - 这只是一个秘密的URL,但应该对缓存实现保持不透明。但是,您可以从给定实体收集的任何信息都是合理的游戏,包括entity.content
的类型。
当前API下的一个皱纹 - 它是一个严重的皱纹 - 是你需要保持从Siesta的键(你应该视为不透明)到不同类型的Realm对象的映射。你可以这样做:
siestaKey
属性并在模型之间进行某种联合查询,或我可能会按顺序追求选项,但我相信你在使用Realm作为EntityCache
的支持时处于相对未开发的(尽管非常合理)领域。一旦您确定了选项,我建议您为任何建议的API改进提交Github问题。