AFNetworking的UIImageView类别的预缓存图像



当我的应用程序加载时,我拉下了 99 个对象的 JSON 表示形式。

每个对象都有一个"image_url"字段,我将其传递给AFNetworking的setImageWithURLRequest

我的图像在 tableView 中加载,因此,只有前几个单元格请求其图像。直到我向下滚动,才会发出后续的图像请求。

一旦我拉下初始数据集,我希望能够启动一个后台进程,该进程出去并下载最初不可见的 95 个左右的对象,并以这样一种方式缓存它们,即当调用 setImageWithURLRequest 时,它已经有一个缓存的图像可以从中提取。

AFImageCache是私有的,所以我不确定这是否可能。我知道我可以使用 NSURLCache 进行缓存,但是我会有两个单独的独立缓存,这也不是理想的。

我唯一的选择是不要使用AFNetworking的UIImageView类别吗?

这些答案让我觉得:

使用AFImageCache缓存图像似乎
不起作用如何在使用AFNetworking的setImageWithURL时配置缓存

请不要这样做。

当我说这几乎肯定是不必要的时,请相信我。

事实上,由于下载可能永远不会被查看的图像的压力增加,它可能会产生与预期效果相反的效果。

缓存是私有的,这是有充分理由的 - 它只是为了加快滚动视图的后续请求。只需让表格视图按照要求下载图像,您应该没问题。如果有的话,您可以优化正在下载的图像的大小(确保正确的图像尺寸;智能压缩)。

我不会创建一堆 UIImageView 来实现您的目的,这将是一种非常低效的方法。

您可以添加自己的方法来实现此功能UIImageView+AFNetworking.h。我瘦了,这将是最好的方法。一个未经测试的例子是:

+ (void) cacheImageWithURL:(NSURL *)url 
{
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0];
    [request setHTTPShouldHandleCookies:NO];
    [request setHTTPShouldUsePipelining:YES];
    AFImageRequestOperation *requestOperation = [[[AFImageRequestOperation alloc] initWithRequest:request] autorelease];
    [requestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        [[[self class] af_sharedImageCache] cacheImage:responseObject forRequest:request];
    } 
    failure:^(AFHTTPRequestOperation *operation, NSError *error) {}];
}
这里有

一个解决方案 - 创建一些UIImageView对象(但不要将它们添加为子视图),然后使用AFNetworking的UIImageView类别来获取图像并填充其内部缓存。

示例代码:

NSArray *strings = [NSArray arrayWithObjects:
                    @"http://i.imgur.com/IpQzE.png",
                    @"http://i.imgur.com/sDnLs.jpg",
                    nil];
for (NSString *string in strings) {
    UIImageView *imageView = [[[UIImageView alloc] init] autorelease];
    [imageView setImageWithURL:[NSURL URLWithString:string]];
}

您可能需要考虑满载

一个简单的自我维护缓存是下载图像并保存到依赖于 url 的文件名。

每当您想从 url 加载图像时,请先尝试从硬盘读取 - 如果返回 nil,请继续使用图像下载器。

不过,请记住清除图像缓存。

最新更新