AFNetworking之AFURLResponseSerialization

当AFURLRequestSerialization类将所有的请求数据处理完成发送请求之后,当收到返回的数据信息时,这时就要靠AFURLResponseSerialization类来完成不同类型返回数据的序列化操作。
【AFNetworking之AFURLResponseSerialization】先声明了AFURLResponseSerialization协议,协议中只有一个方法,将response解码成指定的相关数据,这是所有响应类都需要遵循的协议。之后声明了一个AFHTTPResponseSerializer类,作为响应类的根类。再往下的类,都是继承自AFHTTPResponseSerializer的子类,分别是AFJSONResponseSerializer(JSON格式数据响应,默认)、AFXMLParserResponseSerializer(iOS端XML数据解析响应)、AFXMLDocumentResponseSerializer(MAC OS端XML数据解析响应)、AFPropertyListResponseSerializer(PList格式数据解析响应)、AFImageResponseSerializer(图片数据解析响应)和AFCompoundResponseSerializer(复合式数据解析响应)
在父类AFHTTPResponseSerializer中,遵循的协议方法不做任何事情 只做一次response的验证。实现方法中,只有[self validateResponse:(NSHTTPURLResponse *)response data:data error:error]验证response是否合规的方法。而且初始化init方法中,父类只是设置编码格式为UTF-8,设置http状态码为200-299,表示只有这些状态码获得了有效的响应,而不在接受范围内的状态码和内容类型会在数据解析时发生错误。而且其中一句代码self.acceptableContentTypes = nil; ,本身acceptableContentTypes用于设置可接受的contentType,这里置为nil,也从侧面建议不要直接使用父类。所以,当需要响应具体不同类型的数据序列化操作时,都是由其对应的子类来完成任务。
以JSON格式的数据为例,当响应到JSON格式的数据时,就需要AFJSONResponseSerializer子类去完成response序列化工作。
首先在初始化方法init中,设置了acceptableContentTypes的集合内容self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", nil]; 接下来,AFJSONResponseSerializer类遵循的协议方法会对JSON格式的数据进行删除空数据处理,利用遍历与递归将value值为空的key进行删除操作。类似的,AFXMLParserResponseSerializer、AFXMLDocumentResponseSerializer、AFPropertyListResponseSerializer都是将返回数据进行对应格式类型的数据转换,并删除其中无效的key,最终返回出response。AFCompoundResponseSerializer类型的,会进行所有支持数据类型的遍历,以匹配哪种类型的数据可以进行数据解析。

    推荐阅读