使用 AFNetworking 缓存更大的图像
Posted
技术标签:
【中文标题】使用 AFNetworking 缓存更大的图像【英文标题】:Caching Larger Image Using AFNetworking 【发布时间】:2015-04-02 03:07:15 【问题描述】:我是 AFNetworking 新手,ios 开发经验较少。
我使用AFNetworking从网上下载图片,代码如下:
- (void)dowloadPoject
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer.cachePolicy = NSURLRequestReturnCacheDataElseLoad;
BOOL __block responseFromCache = YES; // yes by default
void (^requestSuccessBlock)(AFHTTPRequestOperation *operation, id responseObject) = ^(AFHTTPRequestOperation *operation, id responseObject)
if (responseFromCache)
// response was returned from cache
NSLog(@"RESPONSE FROM CACHE: %@", responseObject);
else
// response was returned from the server, not from cache
NSLog(@"RESPONSE From Server: %@", responseObject);
UIImage *downloadedImage = [[UIImage alloc] init];
downloadedImage = responseObject;
// Add & Reload Data
[self.projectImage addObject:downloadedImage];
[self.projectname addObject:@"ABC"];
[self reloadComingSoonProject];
[self reloadNewReleaseProject];
;
void (^requestFailureBlock)(AFHTTPRequestOperation *operation, NSError *error) = ^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"ERROR: %@", error);
;
AFHTTPRequestOperation *operation = [manager GET:@"http://i359.photobucket.com/albums/oo34/SenaSLA/walls/Forward-Arrow-Button.png"
parameters:nil
success:requestSuccessBlock
failure:requestFailureBlock];
operation.responseSerializer = [AFImageResponseSerializer serializer];
[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead)
NSLog(@"bytesRead: %u, totalBytesRead: %lld, totalBytesExpectedToRead: %lld", bytesRead, totalBytesRead, totalBytesExpectedToRead);
[self.viewNavBar.progressbar setProgress:(totalBytesRead/totalBytesExpectedToRead) animated:YES];
];
[operation setCacheResponseBlock:^NSCachedURLResponse *(NSURLConnection *connection, NSCachedURLResponse *cachedResponse)
// this will be called whenever server returns status code 200, not 304
responseFromCache = NO;
return cachedResponse;
];
我一直在互联网上搜索,但仍然没有找到正确的解决方案。我已经从rckoenes 尝试过这个解决方案,但这对我不起作用。
我已成功缓存 4kb 之类的图像,但是当我尝试使用 103kb 之类的图像时,它不会缓存。谢谢。
【问题讨论】:
不相关,但您的UIImage *downloadedImage = [[UIImage alloc] init]; downloadedImage = responseObject;
代码可以简化为 UIImage *downloadedImage = responseObject;
。
【参考方案1】:
您可以尝试增加缓存大小。上次我对此进行测试时,如果接收到的数据超过总缓存大小的 5%,网络代码将不会缓存(尽管令人讨厌的是,我还没有看到 Apple 清楚地阐明缓存期间应用的规则)。
无论如何,如果您查看示例 AFNetworking 项目中的应用委托,它会显示如何指定缓存大小的示例:
NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil];
[NSURLCache setSharedURLCache:cache];
看起来默认的 RAM 缓存只有 0.5mb,磁盘缓存只有 10mb。通过将 RAM 缓存增加到 4mb(如上所示)或更大,您应该能够缓存 103kb 的图像(假设所有其他条件,例如响应的标头字段等都允许)。
【讨论】:
嗨@Rob。在对来自谷歌搜索的图像进行了几次测试之后。我发现我的程序甚至可以缓存高达 2.5MB 的图像,来源来自一个网站(我用谷歌搜索)。但我无法缓存从保管箱下载的图像(即图像 103KB 图像)。你知道为什么吗? 应用了许多标准。大小(缓存大小的百分比)以及标头。比较响应的标题,我怀疑您会发现差异。坦率地说,您可能会考虑使用自己的应用级缓存。例如,我相信这就是 AFNetworkingUIImageView
类别所做的。以上是关于使用 AFNetworking 缓存更大的图像的主要内容,如果未能解决你的问题,请参考以下文章
iOS - 使用 AFNetworking 获取图像保持缓存
如何在巨大的 CollectionView 中使用 SDWebImage 或 AFNetworking 在磁盘上缓存图像?