【发布时间】:2013-01-31 10:34:17
【问题描述】:
我正在开发一个与 iOS 的原生照片应用程序非常相似的 UITableView:它有很多行,每行有 4 个图像缩略图。 (即每个 UITableViewCell 有 4 个 UIImageViews)从 Core Data 加载的所有缩略图。
我已经多次修改了我的实现,我可以看到性能改进,但它仍然无法像照片应用程序那样流畅地滚动。
我需要有关如何正确缓存照片以获得最佳性能的建议。这是我尝试过的:
1.我的第一次尝试(滚动时非常滞后)
- 图像在 CoreData 中以 Transformable 类型存储。
- 在 cellForRow 函数中,每张图片都是从 CoreData 上的 飞。
2。第二次尝试(更快,但滚动时仍然有点滞后)
- 图像以二进制数据类型存储,CoreData 中勾选了“外部存储”选项。
- 在 cellForRow 函数中,每个图像首先从 Core Data 加载,然后存储到内存中的 NSCache 中,因此下次 cellForRow 触发时,如果可用,我们将直接使用 NSCache 中的 UIImage。
在使用 NSCache 缓存从 CoreData 加载的图像后,滚动速度明显更快,但由于在 NSCache 中尚不可用时仍需要从 CoreData 加载图像,因此滚动仍会不时出现抖动。
所以,一定有更好的方法,我可以将所有图像预加载到内存中,但由于可能存在大量或多行图像,所以我根本不打算预加载图像。
我还能做些什么来更快地在 cellForRowAtIndexPath 中加载图像?
【问题讨论】:
-
您从哪里加载图像?是网络服务器还是本地 iphone 相册?
-
嗨 Muhammad,这些图片实际上是用户 Facebook 好友的 Facebook 个人资料图片。我使用 AFNetworking 类异步下载它们,然后显示并将它们存储到 Core Data + NSCache 中。当我调试这个问题时,我将场景简化为:所有图像都已经下载并在 CoreData 中可用,我只是从 CoreData 加载它们(想象用户在离线模式下查看他们的 Facebook 相册)。该表仍在缓慢滚动,这就是为什么我没有提到问题中的下载部分以简化问题。谢谢!
-
更多说明:如果我使用 UIImageView+AFNetworking 那么我可以流畅地显示用户的 facebook 朋友头像图像的表格,而不会出现滚动问题。但这意味着应用程序每次加载时都必须一次又一次地从服务器下载图像。我尝试使用 SDURLCache 离线缓存图像,但它不起作用,我喜欢对缓存进行精细控制,所以我决定只使用 AFNetworking 下载配置文件图像,但我自己使用 CoreData 将其缓存以供离线使用。