2

我只是在集成 Siesta,我喜欢它,它解决了我们在使用 RestKit 等框架时遇到的很多问题。

我无法理解的是如何使用内容转换器?我查看了文档和示例,但我不太明白它是如何工作的,我对 Swift 也很陌生。

查看从另一个 SO 回复中获取的示例:

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

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

我已经了解NSValueTransformer对象在 Obj-C 中的工作方式,但我不知道如何将响应 abit JSON 或简单的响应主体(如单个字符串、布尔值的数量)映射到对象或使用 Siesta 的类型。

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

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

谢谢。

4

1 回答 1

3

你的一些困惑是基本的 Swift 东西。在闭包使用$0且仅包含单个语句的情况下,输入类型是推断的并且return是隐式的。因此,您问题中的代码相当于:

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

(使用$0.content而不是仅仅$0是 Swift 中可能错误可能功能的一种解决方法,其中$0成为所有参数的元组,而不仅仅是第一个参数。不要太担心它;$0.content这只是一个你可以使用的魔法咒语在你的午睡变压器中。)

你困惑的另一半是午睡本身。一般做法如下:

  1. 配置一个通用转换器,将原始数据NSData转换为解码但非结构化的类型,例如Stringor Dictionary
  2. 可以选择配置第二个转换器,将非结构化类型转换为模型。
    • 您通常会根据 API 路径进行配置。
    • 默认情况下,Siesta 不包括任何这些。这都是每个应用程序。

对于仅仅是一个布尔值的响应,你可能只做#1——这取决于服务器正在发送的响应类型,以及你如何知道它只是一个布尔值。

我建议查看Siesta 附带的示例项目,它提供了一个很好的例子来说明所有这些是如何发挥作用的。您将在该代码中看到基于内容类型 (#1)特定于模型的转换器 (#2)有条件地对内容进行操作的转换器示例。

于 2016-03-18T16:54:08.740 回答