iOS之AFNetworking

上篇说的是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://www.cocoachina.com/ios/20141120/10265.html
讲解很详细。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值