博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS之AFNetworking
阅读量:4108 次
发布时间:2019-05-25

本文共 2024 字,大约阅读时间需要 6 分钟。

上篇说的是AFNetworking的请求实现,这里来说一下AFURLResponseserialization.

AFURLResponseserialization比AFURLRequestserialization要简单多了,主要是两个方法。

-validateResponse:data:error:

基类AFHTTPResponseSerializer的这个方法检测返回的HTTP状态码和数据类型是否合法,属性acceptableStatusCodes和acceptableContentTypes规定了合法的状态码和数据类型,例如JSONSerialization就把acceptableContentTypes设为@”application/json”, @”text/json”, @”text/javascript”,若不是这三者之一,就验证失败,返回相应的NSError对象。一般子类不需要重写这个方法,只需要设置好acceptableStatusCodes和acceptableContentTypes就行了。

-responseObjectForResponse:data:error:

这个方法解析数据,把NSData转成相应的对象,上层AFURLConnectionOperation会调用这个方法获取转换后的对象。

在解析数据之前会先调上述的validateResponse方法检测HTTP响应是否合法,要注意的是即使这里检测返回不合法,也会继续解析数据生成对象,因为有可能错误信息就在返回的数据里。

如果validateResponse返回error,这里的解析数据又出错,这时有两个error对象,怎样返回给上层?这里的处理是把解析数据的NSError对象保存到validateResponse NSError的userInfo里,作为UnderlyingError,NSError专门给了个NSUnderlyingErrorKey作为这种错误包含错误的键值。

- (IBAction)Action8:(id)sender {    NSURL * url = [NSURL URLWithString:@"http://42.121.34.216/video/lamp500.jpg"];    NSURLRequest * request = [NSURLRequest requestWithURL:url];    self.imageV1 = [[UIImageView alloc] initWithFrame:CGRectMake(200, 200, 100, 100)];    //[self.imageV1 setImageWithURL:url placeholderImage:[UIImage imageNamed:@"01.jpg"]];    [self.imageV1 setImageWithURLRequest:request placeholderImage:[UIImage imageNamed:@"01.jpg"] success:^(NSURLRequest* request, NSHTTPURLResponse * response, UIImage * image){        self.imageV1.image = image;        NSLog(@"success");    }failure:^(NSURLRequest * request, NSHTTPURLResponse * response, NSError *error){       NSLog(@"%@",error);   }];    [self.view addSubview:imageV1];}

当我们调用UIImage的方法imageWithData:方法把数据转成UIImage对象后,其实这时UIImage对象还没准备好需要渲染到屏幕的数据,现在的网络图像PNG和JPG都是压缩格式,需要把它们解压转成bitmap后才能渲染到屏幕上,如果不做任何处理,当你把UIImage赋给UIImageView,在渲染之前底层会判断到UIImage对象未解压,没有bitmap数据,这时会在主线程对图片进行解压操作,再渲染到屏幕上。这个解压操作是比较耗时的,如果任由它在主线程做,可能会导致速度慢UI卡顿的问题。

AFImageResponseSerializer除了把返回数据解析成UIImage外,还会把图像数据解压,这个处理是在子线程(AFNetworking专用的一条线程,详见AFURLConnectionOperation),处理后上层使用返回的UIImage在主线程渲染时就不需要做解压这步操作,主线程减轻了负担,减少了UI卡顿问题。

感谢

讲解很详细。

转载地址:http://vjtsi.baihongyu.com/

你可能感兴趣的文章
idea 有时提示找不到类或者符号
查看>>
ng-class的几种用法
查看>>
node入门demo-Ajax让前端angularjs/jquery与后台node.js交互,技术支持:mysql+html+angularjs/jquery
查看>>
神经网络--单层感知器
查看>>
注册表修改DOS的编码页为utf-8
查看>>
matplotlib.pyplot.plot()参数详解
查看>>
拉格朗日对偶问题详解
查看>>
MFC矩阵运算
查看>>
最小二乘法拟合:原理,python源码,C++源码
查看>>
ubuntu 安装mysql
查看>>
c# 计算器
查看>>
C# 简单的矩阵运算
查看>>
gcc 常用选项详解
查看>>
c++输入文件流ifstream用法详解
查看>>
c++输出文件流ofstream用法详解
查看>>
字符编码:ASCII,Unicode 和 UTF-8
查看>>
firewalld的基本使用
查看>>
Linux下SVN客户端使用教程
查看>>
i2c-tools
查看>>
Linux分区方案
查看>>