我想使用ResponseTransformer(或其中一系列)自动将我的对象模型类映射到从Siesta服务返回的响应,以便我的Siesta资源是我的模型类的实例.我有一个类的工作实现,但我想知道在为每种类型的资源(模型)构建单独的ResponseTransformer之前是否有更安全,更智能或更有效的方法.
这是一个示例模型类:
import SwiftyJSON
class Challenge {
var id:String?
var name:String?
init(fromDictionary:JSON) {
if let challengeId = fromDictionary["id"].int {
self.id = String(challengeId)
}
self.name = fromDictionary["name"].string
}
}
extension Challenge {
class func parseChallengeList(fromJSON:JSON) -> [Challenge] {
var list = [Challenge]()
switch fromJSON.type {
case .Array:
for itemDictionary in fromJSON.array! {
let item = Challenge(fromDictionary: itemDictionary)
list.append(item)
}
case .Dictionary:
list.append(Challenge(fromDictionary: fromJSON))
default: break
}
return list
}
}
Run Code Online (Sandbox Code Playgroud)
这里是我构建的ResponseTransformer,用于映射来自任何端点的响应,该端点返回此模型类型的集合或此模型类型的单个实例:
public func ChallengeListTransformer(transformErrors: Bool = true) -> ResponseTransformer {
return …Run Code Online (Sandbox Code Playgroud) 我正在使用(和爱)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中的对象.
任何有关如何处理此问题的建议将不胜感激.