iOS之AFNetworking

    xiaoxiao2025-02-02  12

    上篇说的是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 讲解很详细。

    转载请注明原文地址: https://ju.6miu.com/read-1296024.html
    最新回复(0)