从Web下载图像并使用Core Data进行缓存

时间:2012-09-02 20:11:22

标签: ios core-data uiimageview

想象一下,您使用的是通过API提供图像的Web服务。每个图像都有一个UID,你有一个核心数据实体 Image ,其属性为 uid (int)和 image (可转换)。

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

为此目的为UIImageView创建子类是否有用?

3 个答案:

答案 0 :(得分:3)

  1. 是的,您可以使用Core Data进行此操作,但请注意,使用Core Data存储图像时会出现性能损失。如果您处理的是小型(例如缩略图)图像,则可以忽略不计,但对于非常大的图像,可以观察到性能损失。对于大图像,我将图像存储在Documents文件夹(或者更好的是子文件夹)中,并使用核心数据来跟踪已下载的图像,文件名等。但是如果图像是更小,保持Core Data中的所有内容更加清晰。

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

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

答案 1 :(得分:2)

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

但是,我发现this article that talks about Core Data Image Caching可能有用。

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

答案 2 :(得分:0)

如果您不完全需要Core Data,那么我可以建议使用MWPhotoBrowser吗?

https://github.com/mwaterfall/MWPhotoBrowser

它必须为您生成一个图库视图控制器,您可以将其推到导航控制器上。图库视图控制器具有可滚动的图像,包括缩放,平移,一切,甚至通过电子邮件将照片发送给某人。

它还使用活动指示器延迟加载图像。

简短回答:你想做的一切都不用重新发明轮子。