标签: siesta-swift

将REST URL模式映射到Siesta框架的模型对象的最佳方法是什么?

我想使用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)

rest ios siesta swift siesta-swift

11
推荐指数
1
解决办法
1529
查看次数

如何使用结构化模型层在Siesta中实现持久缓存

我正在使用(和爱)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中的对象.

任何有关如何处理此问题的建议将不胜感激.

realm ios swift siesta-swift

9
推荐指数
1
解决办法
1038
查看次数

带有url参数的Siesta iOS GET请求

有没有办法在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)

但它总是失败"网络连接丢失.",但所有其他请求成功,所以消息是错误的.

ios swift siesta-swift

4
推荐指数
1
解决办法
1669
查看次数

我如何模拟资源响应?

在我的应用程序中,我有一个封装a的类,Service并具有返回资源和请求的方法.在我的测试中,我想模拟请求和资源的成功/失败,而不进行任何真正的网络调用.
既然Request是协议,很容易通过返回一个自定义实现,只是要求要做到这一点onSuccess,onFailure等等.

但是,返回a的方法并不那么简单Resource,因为Resource它是最终类而不是协议.
我想创建一个模拟Resource,在load()调用etc 时不会做任何真正的网络请求,并暴露某种方式伪造成功/失败,触发观察者添加到Resource.

目前有没有办法做到这一点?

siesta-swift

4
推荐指数
1
解决办法
687
查看次数

Swift结构:模块中没有名为“ Business”的类型

我正在使用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)

xcode struct ios-frameworks siesta-swift swift3

1
推荐指数
1
解决办法
943
查看次数

快速发送HTTP请求中的数字值,将000000000000001添加到实际值

我正在尝试向服务器执行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)

ios swift siesta-swift

1
推荐指数
1
解决办法
461
查看次数

标签 统计

siesta-swift ×6

ios ×4

swift ×4

ios-frameworks ×1

realm ×1

rest ×1

siesta ×1

struct ×1

swift3 ×1

xcode ×1