Я хотел бы использовать 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
}
}
И вот обработчик ResponseTransformer, который я построил для сопоставления ответа от любой конечной точки, которая возвращает либо коллекцию этого типа модели, либо один экземпляр этого типа модели:
public func ChallengeListTransformer(transformErrors: Bool = true) -> ResponseTransformer {
return ResponseContentTransformer(transformErrors: transformErrors)
{
(content: NSJSONConvertible, entity: Entity) throws -> [Challenge] in
let itemJSON = JSON(content)
return Challenge.parseChallengeList(itemJSON)
}
}
И, наконец, вот картирование URL-шаблона, которое я выполняю при настройке службы Siesta:
class _GFSFAPI: Service {
...
configure("/Challenge/*") { $0.config.responseTransformers.add(ChallengeListTransformer()) }
}
Я планирую создать отдельный ResponseTransformer для каждого типа модели, а затем индивидуально сопоставить каждый шаблон URL с этим трансформатором. Это лучший подход? Кстати, я очень взволнована новой картой Siesta. Мне нравится идея ресурсно-ориентированной сетевой библиотеки REST.