Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 用于AFX网络的预缓存映像';UIImageView类别_Objective C_Ios_Caching_Afnetworking_Nsurlcache - Fatal编程技术网

Objective c 用于AFX网络的预缓存映像';UIImageView类别

Objective c 用于AFX网络的预缓存映像';UIImageView类别,objective-c,ios,caching,afnetworking,nsurlcache,Objective C,Ios,Caching,Afnetworking,Nsurlcache,当我的应用程序加载时,我会下拉99个对象的JSON表示 每个对象都有一个“image\u url”字段,我将其传递给AFNetworking的setImageWithURLRequest 我的图像加载到tableView中,因此,只有前几个单元格请求它们的图像。直到我向下滚动时,才会发出后续图像请求 一旦我调出初始数据集,我希望能够启动一个后台进程,下载95个左右最初不可见的对象,并以这样的方式缓存它们:当调用setImageWithURLRequest时,它已经有了一个缓存的图像可供调出 不过

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

每个对象都有一个“image\u url”字段,我将其传递给AFNetworking的
setImageWithURLRequest

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

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

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

我唯一不使用AFNetworking的UIImageView类别的选项是什么

这些答案让我这么想:



这里有一个解决方案-创建一些
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]];
}

<>你可能想考虑< /P> 一个简单的自我维护缓存是下载图像并保存到依赖url的文件名

无论何时,只要您想从url加载图像,请先尝试从硬盘读取-如果返回nil,请继续使用图像下载程序


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

我不会创建一堆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的额外开销。这不是我需要担心的事吗?我会用100-500个图像来做这件事。UIImage对象的内存使用量将远远超过UIImageView(特别是如果它们从未作为子视图添加的话)。无论您最终使用何种策略,都必须使用实际硬件上的仪器仔细检查其性能。下载这么多图像可能会触发内存警告,这将导致图像缓存被清除(请查看文档中的NSCache)。将95个图像缓存到ram将占用大量ram。如果你这样做,请不要使用内置缓存,而是在磁盘缓存中生成缓存目录。我有完全相同的问题。我正在将图像缓存到磁盘上。但当我试图从缓存加载它们时,有时找不到它们。我问了一个问题,我将如何只预加载接下来的3或4张图像?