我想使用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中的对象.
任何有关如何处理此问题的建议将不胜感激.
有没有办法在Siesta中提供GET请求,同时提供参数,例如http://example.com/api/list.json?myparam=1?
我试过了
myAPI.resource("list.json?myparam=1")
Run Code Online (Sandbox Code Playgroud)
但是问号被逃脱了.
然后我尝试了
myAPI.resource("list.json").request(.GET, urlEncoded:["myparam": "1"])
Run Code Online (Sandbox Code Playgroud)
但它总是失败"网络连接丢失.",但所有其他请求成功,所以消息是错误的.
在我的应用程序中,我有一个封装a的类,Service并具有返回资源和请求的方法.在我的测试中,我想模拟请求和资源的成功/失败,而不进行任何真正的网络调用.
既然Request是协议,很容易通过返回一个自定义实现,只是要求要做到这一点onSuccess,onFailure等等.
但是,返回a的方法并不那么简单Resource,因为Resource它是最终类而不是协议.
我想创建一个模拟Resource,在load()调用etc 时不会做任何真正的网络请求,并暴露某种方式伪造成功/失败,触发观察者添加到Resource.
目前有没有办法做到这一点?
我正在使用Swift 3和Xcode 8.1构建项目。首先,我在框架上使用Siesta创建了一个API客户端,并将其包含在我的邮件项目中,但是当我尝试使用框架中的结构进行向下转换时,出现错误No type named 'Business' in module 'ApiClient',我尝试使用它,ApiClient.Business但是没有成功...
我的框架和另一个由carthage注入的依赖项一起在工作区中,我可以从中调用另一个实例(例如API本身),但是我需要访问它才能下调结果。我也尝试过在“ 与库链接二进制文件”,“ 编译源”,“ 嵌入框架”,“ 嵌入式二进制文件”和“ 链接框架和库”下添加框架,但是无法使其正常工作...
这是我的代码
//
// BusinessesViewController.swift
//
import UIKit
import ApiClient
import Siesta
class BusinessesViewController: UIViewController, ResourceObserver{
override func viewDidLoad() {
super.viewDidLoad()
globalInstance.MyAPI.businesses.addObserver(self).loadIfNeeded()
}
func resourceChanged(_ resource: Resource, event: ResourceEvent) {
let businesses: Array = resource.typedContent(ifNone: [])
if(businesses.count > 0){
let object : ApiClient.Business = businesses[0] as! ApiClient.Business // <-- error here
}
}
override func didReceiveMemoryWarning() { …Run Code Online (Sandbox Code Playgroud) 我正在尝试向服务器执行HTTP请求:内容是一个JSON对象,其中包含键“金额”的数字值。如果“金额”是带有十进制数字的值,例如1.6,则请求将包含值1.6000000000000001,并且服务器不接受该值(api是Java编写的,类型是float。我无法发送服务器的字符串,因为从我那里接收数据的API只能接受“金额”的数字。我尝试使用Siesta Framework或dataTask执行请求,但结果始终相同
这就是我创建请求的方式(我省略了不太重要的部分)
let jsonData = try! JSONSerialization.data(withJSONObject: jsonObject) // jsonObject contains the Double value "amount"
let request = URLRequest(url: url)
request.httpBody = jsonData
let task = URLSession.shared.dataTask(with: request)
task.resume()
Run Code Online (Sandbox Code Playgroud)