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