使用 UIImage 对象的系统缓存以及从磁盘缓存(NSCachesDirectory)加载的图像?
我正在尝试提高 UITableView
的滚动性能,该 UITableView 使用带有从网络获取但存储在 NSCachesDirectory
中的图像的单元格。单元格具有自定义内容视图来绘制内容(图像)。
当我使用应用程序包中的占位符图像时,使用 [UIImage imageNamed:@"Placeholder.png"]
,滚动性能非常快。
当我使用 [UIImage imageWithContentsOfFile:cachePath]
从磁盘缓存 (NSCachesDirectory
) 加载图像时,滚动性能变得更差。
根据文档, imageNamed:
缓存图像,而 imageWithContentsOfFile:
则不会。
使用 imageWithContentsOfFile:
时如何使用 UIImage
的系统缓存?
非常感谢!
I'm trying to improve scrolling performance on a UITableView
that uses cells with images fetched from the web, but stored in the NSCachesDirectory
. The cells have a custom content view to draw the contents (an image).
When I use a placeholder image from the app bundle, using [UIImage imageNamed:@"Placeholder.png"]
, scrolling performance is super fast.
When I load an image from the disk cache (NSCachesDirectory
) using [UIImage imageWithContentsOfFile:cachePath]
, scrolling performance gets worse.
According to the documentation, imageNamed:
caches the image and imageWithContentsOfFile:
does not.
How to use UIImage
's system cache when using imageWithContentsOfFile:
?
Thanks a bunch!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
似乎可以使用 NSCachesDirectory 中图像的路径作为
[UIImage imageNamed:]
方法的参数。该方法接受相对路径(相对于应用程序包),例如:@"../Library/Caches/SomeCachedImage.png"
有效。如果多次使用图像,UIImage 会自动将图像缓存在内存中,从而提高在表视图中多次使用图像时的性能。
It seems to be possible to use the path to an image in the
NSCachesDirectory
as argument for the[UIImage imageNamed:]
method. The method accepts relative paths (relative to the app bundle), e.g.:@"../Library/Caches/SomeCachedImage.png"
works.UIImage automatically caches the image in memory if it is used multiple times, which improves the performance when an image is used multiple times in a table view.
问题很可能是您在主运行循环中加载和解压缩图像。这将在短时间内阻塞用户界面。如果您在单独的线程中进行加载和解压缩并且仅在主循环中设置图像,您将获得更好的性能。 (这也是用户界面更改所必需的,即在 UIImageView 上设置图像)
这将需要更多的基础设施。例如通知方案或键值观察。
The problem is most likely that you are loading and decompressing the image in the main run loop. This will block the user interface for a short time. You get much better performance if you do the loading and decompression in a seperate thread and only set the image in the main loop. (Which is also required for user interface changes, which setting an image on a UIImageView is)
This will require some more infrastructure. Like for example a notification scheme or key value observing.
你不能。
imageWithContentsOfFile:
将始终从文件加载图像(尽管是延迟加载)。您可以做的是使用 NSArrays 或 NSDictionaries 创建您自己的内存缓存,具体取决于您想要如何进行查找。You can't.
imageWithContentsOfFile:
will always load the image from file (though lazily). What you can do is create an in memory cache of you own with NSArrays or NSDictionaries, depending on how you'll want to do the lookup.