使用 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 图像)。你知道为什么吗? 应用了许多标准。大小(缓存大小的百分比)以及标头。比较响应的标题,我怀疑您会发现差异。坦率地说,您可能会考虑使用自己的应用级缓存。例如,我相信这就是 AFNetworking UIImageView 类别所做的。

以上是关于使用 AFNetworking 缓存更大的图像的主要内容,如果未能解决你的问题,请参考以下文章

使用 AFNetworking 进行图像缓存

缓存策略,AFNetworking

iOS - 使用 AFNetworking 获取图像保持缓存

AF网络和缓存

IOS 中 AFNetworking 缓存图像中的内存泄漏

如何在巨大的 CollectionView 中使用 SDWebImage 或 AFNetworking 在磁盘上缓存图像?