AFNetworking 框架小结 二(AFURLResponseSerialization)

2024-06-06 13:08

本文主要是介绍AFNetworking 框架小结 二(AFURLResponseSerialization),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

AFURLResponseSerialization

响应报文解析器

在 AFNetworking 网络框架中,为了方便处理网络返回的响应报文,特抽象出来一个响应报文解析器,其相关的类都在 AFURLResponseSerialization.h 文件中。相较于网络请求报文构造器,解析器要简单的多,其关键为抽象类 AFHTTPResponseSerializer 以及其遵循的 AFURLResponseSerialization 协议。

AFHTTPResponseSerializer

AFHTTPResponseSerializer 会对响应报文做一些基本的处理,所以自定义处理 HTTP 响应报文时,应扩展其子类以保证基本的报文处理得以进行,不过,该框架中提供的子类解析器已经满足了大部分需要。

在 AFHTTPResponseSerializer 类中定义了两个重要的属性和一个判断响应报文是否有效的方法。

@property (nonatomic, copy, nullable) NSIndexSet *acceptableStatusCodes;
@property (nonatomic, copy, nullable) NSSet <NSString *> *acceptableContentTypes;
  • acceptableStatusCodes 合法的报文状态码集合
  • acceptableContentTypes 合法的报文体数据类型集合

上述两个属性会在下面的方法中被用来判断响应报文是否是有效报文,当然,如果这两个属性为 nil ,那么便不会使用其进行判断。

- (BOOL)validateResponse:(nullable NSHTTPURLResponse *)responsedata:(nullable NSData *)dataerror:(NSError * _Nullable __autoreleasing *)error;

调用上面的方法,判断 response 的 MIMEType 属性值是否在 acceptableContentTypes 集合中,response 的 statusCode 属性值是否在 acceptableStatusCodes 范围内,并且 data 是否存在,如果校验不通过,相关的错误信息会保存在 error 中并返回 NO 。

在创建解析器时,可以调用类方法 serializer ,在该方法中,会初始化 acceptableStatusCodes 属性集合的范围为 200~300 ,而 acceptableContentTypes 会被置为 nil 。

AFURLResponseSerialization

该协议只提供了一个方法,用来解析响应报文中的数据,最后的返回值为解析后的数据。在自定义 AFHTTPResponseSerializer 的子类时,应该重写该协议方法,因为 AFHTTPResponseSerializer 类中并未对与报文相关的 data 数据进行额外的处理,而是直接返回了。

- (nullable id)responseObjectForResponse:(nullable NSURLResponse *)responsedata:(nullable NSData *)dataerror:(NSError * _Nullable __autoreleasing *)error NS_SWIFT_NOTHROW;

AFJSONResponseSerializer

AFJSONResponseSerializer 类重写了父类 AFHTTPResponseSerializer 中的实例创建方法和初始化方法,并提供了下面的类方法用于创建解析 JSON 数据的实例对象。

+ (instancetype)serializerWithReadingOptions:(NSJSONReadingOptions)readingOptions;

并且可以通过设置 removesKeysWithNullValues 属性值为 YES 来过滤为 NULL 的数据。

在创建 JSON 数据的解析器时,其初始化方法,会将有效的报文类型集合设置为 application/jsontext/jsontext/javascript ,如下:

self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", nil];

这样在校验报文数据时,就会过滤掉非 JSON 格式的返回报文,然后使用 NSJSONSerialization 解析 JSON 数据得到相应的对象,如果需要移除为 NULL 的值,则会接着调用下面的函数。

static id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingOptions readingOptions)

AFXMLParserResponseSerializer

AFXMLParserResponseSerializer 同样是 AFHTTPResponseSerializer 的子类,只是其并未增加属性,只是重写了父类的方法。

在初始化方法中将 acceptableContentTypes 设置为 application/xmltext/xml 的集合。

在 AFURLResponseSerialization 协议的方法中,使用接收到的数据创建了一个 XML 数据解析器 NSXMLParser 并返回,进一步的解析则由用户负责。

AFXMLDocumentResponseSerializer

AFXMLDocumentResponseSerializer 与 AFXMLParserResponseSerializer 类似,有相同的报文类型集合,但是其重写的解析方法最后返回的是 NSXMLDocument 对象。

该解析器只适用于 Mac OS X 系统中

AFPropertyListResponseSerializer

AFPropertyListResponseSerializer 可以用来解析类型为 application/x-plist 的返回报文,在重写 AFURLResponseSerialization 中的方法时,会创建并返回一个 NSPropertyListSerialization 类实例对象。

AFImageResponseSerializer

AFImageResponseSerializer 用来解析请求到的图片数据,其默认支持的图片格式如下:

  • image/tiff
  • image/jpeg
  • image/gif
  • image/png
  • image/ico
  • image/x-icon
  • image/bmp
  • image/x-bmp
  • image/x-xbitmap
  • image/x-win-bitmap

在该子类中,声明了 imageScaleautomaticallyInflatesResponseImage 两个属性,前者指定图片的缩放值,默认为设备屏幕的缩放值。后者指明是否调用函数 AFInflatedImageFromResponseWithDataAtScale 对请求的图片的透明度信息进行填充,默认为 YES ,即进行填充。

在 AFInflatedImageFromResponseWithDataAtScale 函数中,只会对类型为 PNG 和 JPEG 类型的图片进行处理,并且图片如果是 JPEG 类型且其颜色空间为 kCGColorSpaceModelCMYK 类型,也不会进行透明度信息的填充。

另外,获取的图片,其宽和高都要小于 1024 且通道信息的位数不能大于 8 。之后,如果设备所支持的颜色空间模型为 kCGColorSpaceModelRGB 则可以对图片的透明度信息进行处理,分为下面两种情况:

  • 图片的 kCGBitmapAlphaInfoMask 值为 kCGImageAlphaNone 即图片没有透明度信息,那么透明度信息设置为 kCGImageAlphaNoneSkipFirst
  • 图片的 kCGBitmapAlphaInfoMask 值不是 kCGImageAlphaNoneSkipFirstkCGImageAlphaNoneSkipLast 时,设置为 kCGImageAlphaPremultipliedFirst

这两个属性不适用于 Mac OS X 系统中。

AFCompoundResponseSerializer

组合解析器,使用该类可以将多个解析器组合到一个解析器中,用于多种类型数据的解析,对于无法确定返回的数据类型的情况很方便,其实现的方式主要是在重写的协议方法中遍历 responseSerializers 属性中的所有解析器进行数据解析,一旦解析成功,则返回解析结果,否则继续使用下一个解析器。

这些解析器可以是自定义的,但是必需遵循 AFURLResponseSerialization 协议,当然,可能遍历结束后,数据仍然无法解析,参见下面的源码。

- (id)responseObjectForResponse:(NSURLResponse *)responsedata:(NSData *)dataerror:(NSError *__autoreleasing *)error
{for (id <AFURLResponseSerialization> serializer in self.responseSerializers) {if (![serializer isKindOfClass:[AFHTTPResponseSerializer class]]) {continue;}NSError *serializerError = nil;id responseObject = [serializer responseObjectForResponse:response data:data error:&serializerError];if (responseObject) {if (error) {*error = AFErrorWithUnderlyingError(serializerError, *error);}
return responseObject;}}
return [super responseObjectForResponse:response data:data error:error];
}

要注意的是,创建该类时,不能使用父类声明的 serializer 方法,而是要使用该类自己声明的类方法。

+ (instancetype)compoundSerializerWithResponseSerializers:(NSArray <id<AFURLResponseSerialization>> *)responseSerializers;

这篇关于AFNetworking 框架小结 二(AFURLResponseSerialization)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1036193

相关文章

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

Python的端到端测试框架SeleniumBase使用解读

《Python的端到端测试框架SeleniumBase使用解读》:本文主要介绍Python的端到端测试框架SeleniumBase使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录SeleniumBase详细介绍及用法指南什么是 SeleniumBase?SeleniumBase

SpringBoot中使用Flux实现流式返回的方法小结

《SpringBoot中使用Flux实现流式返回的方法小结》文章介绍流式返回(StreamingResponse)在SpringBoot中通过Flux实现,优势包括提升用户体验、降低内存消耗、支持长连... 目录背景流式返回的核心概念与优势1. 提升用户体验2. 降低内存消耗3. 支持长连接与实时通信在Sp

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

Python函数返回多个值的多种方法小结

《Python函数返回多个值的多种方法小结》在Python中,函数通常用于封装一段代码,使其可以重复调用,有时,我们希望一个函数能够返回多个值,Python提供了几种不同的方法来实现这一点,需要的朋友... 目录一、使用元组(Tuple):二、使用列表(list)三、使用字典(Dictionary)四、 使

Python程序的文件头部声明小结

《Python程序的文件头部声明小结》在Python文件的顶部声明编码通常是必须的,尤其是在处理非ASCII字符时,下面就来介绍一下两种头部文件声明,具有一定的参考价值,感兴趣的可以了解一下... 目录一、# coding=utf-8二、#!/usr/bin/env python三、运行Python程序四、

Python中合并列表(list)的六种方法小结

《Python中合并列表(list)的六种方法小结》本文主要介绍了Python中合并列表(list)的六种方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录一、直接用 + 合并列表二、用 extend() js方法三、用 zip() 函数交叉合并四、用