2014-02-26 55 views
-1

有没有办法在缓存之前更改某些数据 - 更具体地说是:图像 - 是否?AFNetworking 2.0:缓存之前处理数据

我从一个不合理的api下载图像。我希望在它们到达时尽快缩小它们,以便它们需要更少的空间,并且每次从缓存中加载时都不需要扩展它们。

我可以在AFImageResponseSerializer的子类或STAHTTPRequestOperation的子类中进行缩放。但无论哪种情况,图像都已经以原始大小缓存。

如何在数据写入缓存之前访问和更改数据?

回答

0

回答我自己的问题:我通过在我的操作类中覆盖connection:willCacheResponse:来实现它。

@implementation MYImageRequestOperation 

-(CGSize)size 
{ 
    return CGSizeZero; // overwritten in subclasses 
} 



-(NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse 
{ 

    UIImage *image = [UIImage imageWithData:cachedResponse.data]; 
    GPUImageLanczosResamplingFilter *resizingFilter = [[GPUImageLanczosResamplingFilter alloc] init]; 

    CGFloat scale = [UIScreen mainScreen].scale; 
    CGSize size = [self size]; 
    [resizingFilter forceProcessingAtSizeRespectingAspectRatio: CGSizeMake(size.width * scale, size.height * scale)]; 
    GPUImagePicture *gpuImage = [[GPUImagePicture alloc] initWithImage:image]; 
    [gpuImage addTarget:resizingFilter]; 
    [gpuImage processImage]; 

    UIImage *smallImage = [resizingFilter imageFromCurrentlyProcessedOutput]; 

    NSData *data; 

    if([[cachedResponse.response.MIMEType lowercaseString] isEqualToString:@"image/png"]) 
    { 
     data = UIImagePNGRepresentation(smallImage); 
    } else { 
     data = UIImageJPEGRepresentation(smallImage, .9); 
    } 

    NSCachedURLResponse *response = [[NSCachedURLResponse alloc] initWithResponse:cachedResponse.response data:data]; 
    return response; 
} 
@end