0

想象一下,您使用通过 API 提供图像的 Web 服务。每个图像都有一个 UID,并且您有一个核心数据实体Image具有属性uid (int) 和image (transformable)。

现在,您的应用程序库需要显示许多图像(UID 是已知的)。您不知道之前已下载和存储了哪些图像。如何在后台延迟下载带有核心数据的图像,以便视图在加载过程中显示 UIActivityIndi​​cator 并在图像存储在本地时自动显示图像(例如通过使用NSFetchedResultsControllerDelegate协议)?

为此目的子类化 UIImageView 有用吗?

4

3 回答 3

3
  1. 是的,您可以为此使用 Core Data,但请注意,当您使用 Core Data 存储图像时,性能会受到影响。如果您正在处理小(例如缩略图)图像,则可以忽略不计,但是对于非常大的图像,可以观察到性能损失。对于大图像,我会将图像存储在Documents文件夹(或者,更好的是子文件夹)中,并使用 Core Data 来跟踪已下载的图像、文件名等。但如果图像较小,则保持一切正确Core Data 中的内容更干净。

  2. 我可能不想为此使用子类UIImageView,因为您可能希望将表示层(图像视图)与图像缓存分离。此外,对于复杂的用户界面,UIImageView当用户滚动浏览大量图像时,对象可能会被丢弃或重用,因此您可能不希望在UIImageView缓存逻辑和缓存逻辑之间建立硬链接。此外,根据您的用户界面,有时图像可以指定比 UIImageView 更广泛的内容(例如,如果您使用的是 tableview,您可能希望在下载图像时根据图像调整单元格高度)。UI 可能执行的操作的细节取决于图像的使用位置(UITableView、显示图像网格的 UIScrollView 等)。

所以,底线,对于简单的用户界面,也许你可以继承 aUIImageView但我通常建议有一些自定义图像缓存对象,使用一些委托协议进行延迟加载,以便在图像加载完成时告诉 UI。

于 2012-09-02T20:49:38.237 回答
2

我不会使用 Core Data 来存储图像,但我会将它们存储在磁盘上。我试图在文档中找到 Apple 自己警告不要在 Core Data 中存储大于 100k 左右的图像,因为你会遇到性能问题。

但是,我发现这篇文章讨论了可能有用的 Core Data Image Caching。

此外,这是另一个Stack Overflow 帖子,其中有一个很好的答案,它告诉您何时将图像存储在数据库中以及何时仅使用对磁盘存储的引用。

于 2012-09-02T20:51:54.277 回答
0

If you don't absolutely need Core Data, then may I recommend using MWPhotoBrowser?

https://github.com/mwaterfall/MWPhotoBrowser

It essential generates a gallery view controller for you which you can push onto your navigation controller. The gallery view controller has scrollable images with pinch zoom, pan, everything, even emailing the photo to someone.

It also does the lazy loading of the image with the activity indicator.

Short answer: everything you wanted to do without reinventing the wheel.

于 2012-09-03T08:41:19.020 回答