在iOS中,应该把远程图片文件缓存到哪里?

9
我计划从服务器缓存图像,并在我的应用程序中以幻灯片形式显示它。我将异步加载这些图像。
我有两个选项:
1. 将图像缓存为文件,需要时使用。 2. 在内存中缓存图像对象,需要时使用,并在应用程序退出时将其写入文件。
哪一个更好呢?
如果您对缓存图像有任何建议,请告诉我。
5个回答

8
您的第二种方法有两个主要缺点:
  1. 如果有太多图片,您的应用程序将会出现低内存警告,并且您必须从内存中释放图像
  2. 在应用程序退出时保存所有图像到文件也不是一个好主意 - 不能保证您的保存代码在应用程序退出时完成(例如,如果它花费太长时间,系统可能会终止您的应用程序,您的图像将会丢失)
我建议在下载后立即将图像保存到文件中,并在不可见延迟的情况下保留需要显示的合理数量的图像(在需要时加载额外的图像并处理不必要的图像)。

4
我建议您选择第一种选项。这样可以让您拥有更多的灵活性,例如当数据大小增加时,可以增加内存大小。

4
我会这样做:使用NSMutableDictionary存储缓存的图像(作为UIImage对象)。如果图像不在缓存中,则查找是否可用作文件。如果无法作为文件使用,则加载它,将其放入字典中并将其写入文件。
关于文件存储位置:where,您可以使用NSTemporaryDirectory()或在NSLibraryDirectory中创建一个目录(使用NSSearchPathForDirectoriesInDomains来定位)。后者的优点/缺点是它将出现在iTunes备份中(这是否是优点取决于用例)。使用Library目录是苹果推荐的方法,用于存储被备份但不显示在iTunes文件交换工具(Documents目录)中的数据。

感谢 Darkdust 提供的逻辑。 - RK-

2
我开始使用EGOImageView来处理我的缓存;它非常灵活,可以自动处理缓存的复杂性。
通过http拉取图像非常有效,你可以在EGO开发者网站上找到它。 http://developers.enormego.com/

这似乎是一个不错的选择... 使用它时你会收到内存警告吗? - RK-
1
不,一点都不 - 嗯,不比平常多;-)代码片段如下 imageView = [[EGOImageView alloc] initWithPlaceholderImage:[UIImage imageNamed:@"Placeholder.jpg"]]; imageView.frame = CGRectMake(4.0f, 4.0f, 36.0f, 36.0f); [self.contentView addSubview:imageView]; imageView.imageURL = [NSURL URLWithString: @"http://some.real.url/withanimage.png"]; - Damo
谢谢Damo..我正在使用这个库。 - RK-

2
在iOS平台上,如果您需要图像缓存解决方案,可以考虑使用SDWebImage框架,该框架可在以下网址中获取:https://github.com/rs/SDWebImage。它非常易于集成,并能够处理您所有的图像缓存问题:请在此处了解更多信息:https://github.com/rs/SDWebImage#readme 我们最近为我们的应用程序选择了这个框架,效果非常好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接