2010-02-21 42 views
5

我试图改善使用单元格与从网络获取的图像但存储在NSCachesDirectory中的UITableView的滚动性能。单元格具有自定义内容视图来绘制内容(图像)。将UIImage对象的系统缓存与从磁盘缓存(NSCachesDirectory)加载的图像配合使用?

当我使用应用程序包中的占位符图像时,使用[UIImage imageNamed:@"Placeholder.png"],滚动性能非常快。

当我使用[UIImage imageWithContentsOfFile:cachePath]从磁盘缓存(NSCachesDirectory)加载图像时,滚动性能变差。

根据文档,imageNamed:缓存图像和imageWithContentsOfFile:没有。

如何在使用imageWithContentsOfFile:时使用UIImage的系统缓存?

非常感谢!

+0

您可能想查看我的[最近的问题](http://stackoverflow.com/questions/18750686/how-to-find-uiimage-bottleneck#comment27641913_18750686),我通过存储未压缩的图像来解决问题。 – 2013-09-28 00:12:12

回答

8

似乎可以使用NSCachesDirectory中图像的路径作为[UIImage imageNamed:]方法的参数。该方法接受相对路径(相对于应用程序包),例如:@"../Library/Caches/SomeCachedImage.png"作品。

如果多次使用UIImage会自动将图像缓存在内存中,这可以提高在表视图中多次使用图像时的性能。

+0

对我来说,这种方法[UIImage imageNamed:]无法加载我在特定路径给出的图像,总是返回零为 – vodkhang 2010-08-20 02:48:49

+0

为我工作。我会尝试使用NSPicturesDirectory,它值得! – 2011-08-31 17:06:29

0

你不能。 imageWithContentsOfFile:将始终从文件加载图像(尽管很懒惰)。你可以做的是创建一个内存缓存,你拥有NSArrays或NSDictionaries,这取决于你想要如何查找。

3

问题很可能是您正在主运行循环中加载和解压缩映像。这会在短时间内阻止用户界面。如果您在单独的线程中执行加载和解压缩,并且只有将主循环中的图像设置为,则会获得更好的性能。 (这也是用户界面更改所需的,它在UIImageView上设置图像)

这将需要更多的基础设施。例如通知方案或关键值观察。

+0

是的,这正是问题所在。我希望有一个现成的解决方案。但我猜这不在那里。感谢你的回答。 – 2010-02-22 13:52:45

+0

如果你喜欢答案,你应该upvote或标记为解决。 – 2010-02-22 15:26:22

+0

UIImage懒惰地解压缩图像位图数据,所以在许多(大多数情况下)这并不会真的有帮助 - 从磁盘加载将发生在后台线程上,但解压缩(通常需要比加载数据更长的时间)会在您设置图像,这必须发生在主线程上。 – 2011-09-29 01:49:40