AFNETWORKING 2.0:キャッシュされる前にデータを処理します
-
21-12-2019 - |
質問
何らかのデータを変更する方法があります - より具体的には:画像 - キャッシュされる前に?
私は不当に大きいAPIから画像をダウンロードします。彼らが到着したらすぐにそれらを拡大縮小したいので、スペースが少なくなる必要があり、キャッシュからロードされるたびにそれらを拡張する必要はありません。
AFImageResponseSerializer
のサブクラスまたはSTAHTTPRequestOperation
のサブクラスのどちらかのスケーリングを行うことができます。しかし、どちらの場合も、画像はすでに元のサイズにキャッシュされています。
キャッシュに書き込まれる前にデータをアクセスして変更する方法は?
解決
自分の質問に答えるために:私の操作クラスの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
. 所属していません StackOverflow