8

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

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

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

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

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

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

这些答案让我这么想:

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

4

4 回答 4

24

请,不要这样做。

当我说这几乎肯定没有必要时,请相信我。

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

缓存是私有的有一个很好的理由——它只是为了加快滚动视图上的后续请求。只需让表格视图按要求下载图像,就可以了。如果有的话,您可以优化正在下载的图像的大小(确保正确的图像尺寸;智能压缩)。

于 2012-07-03T19:10:31.317 回答
5

我不会创建一堆 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) {}];
}
于 2012-07-03T17:07:35.190 回答
3

这是一个解决方案 - 创建一些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]];
}
于 2012-07-02T20:36:18.050 回答
1

您可能要考虑满载

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

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

请记住清除您的图像缓存。

于 2012-07-03T06:11:56.043 回答