当我的应用加载时,我下拉了99个对象的JSON表示。
每个对象都有一个'image_url'字段,我将其传递给AFNetworking的setImageWithURLRequest
。
我的图片加载到tableView中,因此,只有前几个单元格对其图像进行请求。直到我向下滚动,才会发出后续图像请求。
一旦我下拉了初始数据集,我希望能够启动一个后台进程并下载最初不可见的95个左右的对象,并以这样的方式缓存它们setImageWithURLRequest
被调用,它已经有一个缓存的图像可供使用。
虽然AFImageCache是私有的,所以我不确定这是否可行。我知道我可以使用NSURLCache缓存,但后来我有两个独立的,孤立的缓存,这也不理想。
我唯一的选择是不使用AFNetworking的UIImageView类别吗?
这些答案让我这么想:
iOS Caching images with AFImageCache doesn't seem to work
How to configure the cache when using AFNetworking's setImageWithURL
答案 0 :(得分:24)
请请不要这样做。
当我说这几乎肯定是不必要的时候相信我。
事实上,由于下载可能永远不会被查看的图像的压力增加,它可能会产生与预期效果相反的效果。
缓存是私有的,原因很简单 - 它只是为了加快滚动视图上的后续请求。只需让表视图按要求下载图像,你就可以了。如果有的话,您可以优化正在下载的图像的大小(确保正确的图像尺寸;智能压缩)。
答案 1 :(得分: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) {}];
}
答案 2 :(得分: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]];
}
答案 3 :(得分:1)
您可能想要考虑Fully-Loaded
一个简单的自我维护缓存是下载图像并保存为url依赖文件名。
每当您想要从网址加载图片时,请先尝试从硬盘读取 - 如果返回了nil,请继续使用您的图片下载程序。
请记住清除图像缓存。