【发布时间】:2015-06-23 06:39:27
【问题描述】:
我试图理解以下来自Ray Wenderlich tutorial 的示例。我的主要困惑不是 what(以方便的方式将 JSON 数据反序列化到您自己的对象中),而是 如何 它正在这样做。我要做的是按照我的理解解释代码 sn-p 但我的困惑源于 completionHandler 闭包和它的类型定义。在我初步了解代码的作用之后,我会强调这一点。
首先是带有行号的sn-p:
1 @objc public protocol ResponseObjectSerializable {
2 init(response: NSHTTPURLResponse, representation: AnyObject)
3 }
4
5 extension Alamofire.Request {
6 public func responseObject<T: ResponseObjectSerializable>(completionHandler: (NSURLRequest, NSHTTPURLResponse?, T?, NSError?) -> Void) -> Self {
7 let serializer: Serializer = { (request, response, data) in
8 let JSONSerializer = Request.JSONResponseSerializer(options: .AllowFragments)
9 let (JSON: AnyObject?, serializationError) = JSONSerializer(request, response, data)
10 if response != nil && JSON != nil {
11 return (T(response: response!, representation: JSON!), nil)
12 } else {
13 return (nil, serializationError)
14 }
15 }
16
17 return response(serializer: serializer, completionHandler: { (request, response, object, error) in
18 completionHandler(request, response, object as? T, error)
19 })
20 }
21 }
第 6 行 - 这里我们声明一个通用函数 (responseObject),它接受带有 (NSURLRequest, NSHTTPURLResponse?, T?, NSError?) -> Void 签名的“completionHandler”闭包。然后它返回它自己的类 -> self 的一个实例。
第 7 到 15 行 - 这里我们使用 Serializer 签名声明一个闭包。这完成了将 JSON 转换为符合 ResponseObjectSerializable 协议的适当类的实际工作。
第 17 到 19 行 - 这里我们调用 Alamofire.Request 类中的“response()”方法(我认为?)传入之前定义的序列化程序闭包。我们还传入一个 actual completionHandler 闭包,然后调用其他一些神秘的 completionHandler 方法。这个“response()”方法调用的结果返回给客户端代码。
我觉得我理解到了在第 17 行将“completionHandler”闭包作为参数传递的程度。但是我们调用了其他一些“completionHandler”——它在哪里定义?还是它在呼唤自己?
另外,第 17 行的序列化程序在第 7 行创建时看似超出范围,我们是如何引用它的?
【问题讨论】:
-
不,第 18 行调用
completionHandler闭包作为参数传递给第 6 行的responseObject<...。第 17-19 行返回response并带有 intermediate 闭包在第 6 行调用completionHandler闭包并传递与接收到的相同的参数,但有一个异常 - 它尝试将object转换为T,然后将其传递给completionHandler(第 6 行)。 -
这样就更清楚了,谢谢。随意添加它作为答案,我会接受它。
-
做到了,稍微增强了一点,所以,它可以被视为一个答案:-)
标签: swift serialization alamofire