9

我打算缓存来自服务器的图像,并在我的应用程序中将其用作排序幻灯片放映。我将异步加载图像。

我有两个选择:

  1. 要么将图像缓存为文件并在必要时使用它。
  2. 将图像对象缓存在内存中,并在必要时使用它,并在应用程序退出时将其写入文件。

哪一个会更好?

如果您对缓存图像有任何建议,请告诉我。

4

5 回答 5

8

您的第二种方法有两个主要缺陷:

  1. 如果图像太多,那么您的应用程序将收到内存不足警告,并且无论如何您都必须从内存中处理图像
  2. 在应用程序退出时将所有图像保存到文件中也不是一个好主意 - 不能保证您的保存代码将在应用程序退出时完成(例如,如果需要太长时间,系统可能会终止您的应用程序并且您的图像将丢失)

我建议您在下载图像后立即将图像保存到文件中,并在内存中保留需要显示的合理数量的图像,而不会出现明显的延迟(在需要时加载额外的图像并处理不必要的图像)

于 2011-05-12T09:26:30.630 回答
4

我会推荐你​​第一个选项。为您提供更大的灵活性,例如当数据大小增加内存大小时。

于 2011-05-12T09:26:37.137 回答
4

我会这样做:有一个带有缓存图像的 NSMutableDictionary(作为 UIImage 对象)。如果图像不在缓存中,请查看它是否可以作为文件使用。如果它不能作为文件使用,请加载它,将其放入字典中,然后将其写入文件。

至于将文件写入何处:您可以使用NSTemporaryDirectory()或在NSLibraryDirectory中创建一个目录(使用NSSearchPathForDirectoriesInDomains来定位它)。后者具有将在 iTunes 备份中的优点/缺点(这是否是优点取决于用例)。使用 Library 目录是 Apple 推荐的存储已备份但未出现在 iTune 的文件交换事物(Documents 目录)中的数据的方法。

于 2011-05-12T09:30:15.483 回答
2

我已经开始使用 EGOImageView 来处理我的缓存;它非常通用,可以为您处理复杂的缓存。

它非常适合通过 http 拉取图像,您可以在此处的 EGO 开发者网站上找到它

http://developers.enormego.com/

于 2011-05-12T09:50:07.503 回答
2

对于 iOS 平台上的图像缓存解决方案,您可能需要考虑 SDWebImage 框架,该框架位于:https ://github.com/rs/SDWebImage 。它很容易集成并解决您所有的图像缓存问题。:在此处阅读有关工作的更多信息:https ://github.com/rs/SDWebImage#readme

我们最近为我们的应用选择了这个,它工作得很好。

于 2012-11-28T12:49:46.357 回答