【问题标题】:AFNetworking 2.0: Process data before it is cachedAFNetworking 2.0:在缓存之前处理数据
【发布时间】:2014-03-29 11:07:05
【问题描述】:
有没有办法在缓存之前更改一些数据——更具体地说:图像?
我从一个过大的 api 下载图像。我想在它们到达后立即缩小它们,以便它们需要更少的空间,并且每次从缓存加载它们时我都不必缩放它们。
我可以在AFImageResponseSerializer 的子类或STAHTTPRequestOperation 的子类中进行缩放。但无论哪种情况,图像都已以原始大小缓存。
如何在数据写入缓存之前访问和更改数据?
【问题讨论】:
标签:
ios
objective-c
cocoa-touch
caching
afnetworking
【解决方案1】:
回答我自己的问题:我通过在我的操作类中覆盖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