2012-07-24 57 views
3

我计划构建一个主要内容为图像的应用程序。基本上,它将有多个菜单使用UITableViews,其单元格将只有一个图像。当你点击这个单元格时,你将被推到一个带有该图像和另一个图像的简单视图,其中有详细内容的其余部分。将图像保存为核心数据以便在UITableView中使用

这很容易做,我的问题是关于优化。它会有很多的内容(也许1k行),它会在UITableView显示图像,所以核心数据是必须的(因为它是延迟加载和其他几种优化)

我的问题是:什么是最好的,以存储图像在Core Data db(如NSData)或只存储图像的名称?我想象的是,如果我存储资源的名称,对于UITableView中的每一行,设备必须获取该图像,然后处理该图像,最后显示该图像。当滚动它们时(预计会发生很多),我们会有很多提取图像。如果我将它们存储在Core Data中,就像获取该信息并将它用作图像的位置一样简单。

将图像存储在Core Data中的好处与在数据库中存储blob的正常退出一起提供。我不知道核心数据会有多少问题(我在dbs上的经验主要来自MySQL)

另一方面,我的“常识”强制保存名称和获取图像因为他们需要更多的时间,如果他们需要更多的时间,我不确定会有多大的表现。有没有“最好的方式”来存储它们?只需要名称,然后拨打pathForResourse:ofType:或(如果速度更快)mainBundle上的pathForResourse:ofType:inDirectory:,请存储URI或其他形式的指向它的名称。

编辑:应用程序将具有应用程序随附的静态内容,用户将无法以任何方式修改此内容。 (至少在1.0版本)

+0

这些图像有多大? – 2012-07-24 18:23:01

+0

相当小,每个上衣20kb?它们是包含文本和符号的图像,黑白 – Daniel 2012-07-24 19:01:07

+0

如果它们不是太大,我不会太担心它,除了您可能想要将斑点放在单独的对象中,以便您可以加载元数据分开。 – 2012-07-25 12:04:58

回答

5

Core Data Release Notes for iOS v5.0:如图片缩略图

小数据值,可以有效地存储在数据库中,但大的照片或其他媒体最好由文件系统直接处理。您现在可以指定管理对象属性的值可以作为外部记录存储 - 请参阅setAllowsExternalBinaryDataStorage :.启用时,核心数据试探性地决定是否应将数据直接保存到数据库中,或者将URI存储到它为您管理的单独文件中。如果使用此选项,则无法基于二进制数据属性的内容进行查询。

的setAllowsExternalBinaryDataStorage:本质上是做你所描述的 “...只是存储图像的名字......”

也可参考这些其他问题:

  1. CoreData : store images to DB or not?
  2. Core data images from desktop to iphone
  3. Provide example for why it is not advisable to store images in CoreData?
+0

我最近问同样的问题,要求具体的例子。您可以添加到列表也http://stackoverflow.com/questions/10848147/provide-example-for-why-it-is-not-advisable-to-store-images-in-coredata – Leonardo 2012-07-26 15:44:31

+0

@莱昂纳多谢谢。我已经添加了它。 – Michael 2012-07-26 16:06:12

1

你会得到很大的优化,从刚刚使用该文件的名称...

如果重新使用一个文件......你不会有将其存储在数据库两次,或者交替使用一个模型对象来代表该文件为关系。

你可以做一些分析和检查......但我认为只是一个名字将是理想的。 你也可以做一些类似于-imageNamed的工作来为你缓存图像,并且你只需要为每个文件创建一个UIImage,无论它存在于程序中的什么地方。

+0

谢谢,我关心RAM内存优化,而不是使用存储。而且我几乎不会重复使用这些图像。你能否进一步解释你的'-imageNamed:'主意? – Daniel 2012-07-24 17:41:48

+2

如果您关心内存管理,可以使用NSCache来存储图像。 NSCache将“临时存储创建昂贵的瞬态数据的对象”,并且如果内存很紧,对象将被“丢弃”,如果丢弃,则必须在需要时重新计算它们的值。请参阅:https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSCache_Class/Reference/Reference.html – Michael 2012-07-24 17:47:08

+1

-imageNamed只会创建一个全新的UIImage,如果它没有一个缓存的,你可以使用NSCache或您自己的实现来做类似的事情。我想NSHashMap是在IOS – 2012-07-24 17:58:40

1

不要将图像保存在核心数据中。您可以将有关图像的信息以有组织的方式保存在核心数据中,但将图像保存在项目的支持文件部分。或者,如果您要下载图像,则可以将它们缓存在应用程序的图像部分,并简单地更新核心数据中图像的信息。