如何在Siesta中定义内容转换器?

时间:2016-03-18 15:19:30

标签: ios xcode swift siesta-swift

我只是整合了Siesta而我喜欢它,它解决了我们在使用像RestKit这样的框架时遇到的很多问题。

我无法理解的是如何使用内容变换器?我看过文档和示例,我不太明白它是如何工作的,我对Swift也很新。

从另一个SO回复看这个例子:

private let SwiftyJSONTransformer = ResponseContentTransformer(skipWhenEntityMatchesOutputType: false) {
    JSON($0.content as AnyObject)
}

我不太明白这里发生了什么,没有返回值,所以我不明白内容是如何被转换的。这可能是我的原因,因为缺乏深刻的Swift知识。

我已经理解了NSValueTransformer对象在Obj-C中是如何工作的,但我无法弄清楚如何映射响应abit JSON或只是一个简单的响应体,如单个字符串,布尔值的数量为a使用Siesta的对象或类型。

我们有一些API响应在响应主体中只返回一个BOOL值,而大多数其他API响应都是复杂的JSON对象图。

我如何将这些响应映射到更原始的类型和/或更复杂的对象。

感谢。

1 个答案:

答案 0 :(得分:3)

你的一些困惑是基本的Swift东西。如果闭包使用$0并且只包含单个语句,则推断输入类型,并隐式return。因此,您问题中的代码等同于:

ResponseContentTransformer(skipWhenEntityMatchesOutputType: false) {
  (content: AnyObject, entity: Entity) in
  return JSON(content)
}

(使用$0.content代替$0是一种解决方案,可以解决Swift中可能存在错误的问题,其中$0成为所有参数的元组而不仅仅是第一个参数的元组不要过于担心; $0.content只是你可以在Siesta变形金刚中使用的神奇咒语。)

你混淆的另一半是西耶斯塔本身。一般方法如下:

  1. 配置一个通用转换器,将原始NSData转换为已解码但非结构化的类型,例如StringDictionary
  2. (可选)配置第二个转换器,将非结构化类型转换为模型。
    • 您通常会根据API路径进行配置。
    • Siesta默认不包含任何内容;这是所有应用程序。
  3. 对于只是一个布尔值的响应,你可能只做#1 - 取决于服务器发送的确切响应类型,并且取决于你如何知道它只是一个布尔值。

    我建议查看Siesta附带的example project,它提供了一个很好的例子来说明这一切是如何发挥作用的。您会在该代码中看到transformers that conditionally operate on the content based on its type (#1)model-specific tranformers (#2)的示例。