增强我的核心数据设计。仅限专家!

时间:2011-04-29 02:00:38

标签: core-data nsfetchedresultscontroller key-value-observing

Core Data entity diagram

AcaniUsers中,我正在向我下载最近的20个用户,并在表格视图中以缩略图的形式显示他们的个人资料图片。用户& Photo都是资源,因为它们在服务器上都有id(MongoDB BSON ObjectId)。每个用户都有一个unique_id。每张Photo在服务器上有四种不同的尺寸(图像):square:75x75,square @ 2x:150x150,large:320x480,large @ 2x:640x960。但是,每个设备只有两种尺寸,这取决于它是iPhone 3还是4(视网膜显示器)。每种尺寸都有自己的MongoDB系列。并且,每张照片的所有四张图像在这四个系列中都具有相同的BSON ObjectId。

将来,我可能会向用户提供一个名为photos的关系,以允许用户拥有多张照片。此外,虽然我没有预见到这一点,但我可能会添加更多图像尺寸(类型)。

fresh上的Image属性告诉我是否已下载最新的图片。每当NO的ID发生变化时,我都会将其设置为Photo,然后在我下载完图片后再将其设置为是。

  1. 我应该将四个不同的图像存储在Core Data或文件系统中,只将它们的URL存储在Core Data中吗?我读过超过1或2MB的地方,你应该存储在文件系统中,而不是Core Data。所以,我正在考虑将方形图像存储在Core Data中,将大图像存储在文件系统中,但我宁愿以相同的方式存储它们以使事情变得更容易。那么,也许我会将它们全部存储在文件系统中?你觉得怎么样?

  2. 你认为我应该丢弃75x75&很快就会有320x480尺寸的iPhone 3将会消失?

  3. 如何改进实体的设计及其属性和关系。例如,资源实体是否甚至是有益的?

  4. 我正在使用NSFetchedResultsController显示用户。但是,它不知道用户的图像何时更新,因此在我第一次积极滚动之前图像不会显示。如何让NSFetchedResultsController知道用户的缩略图已完成下载?我必须使用KVO吗?

1 个答案:

答案 0 :(得分:1)

回答你的问题:

1我将它们全部存储在文件系统中,并将URL记录在数据库中。我从未成为将数据存储在数据库中的忠实粉丝。此外,它还可以简化一些事情,使所有图像存储均匀。这样在您的图像加载代码中,您不必担心它是存储在数据库中还是存储在文件系统中的类型。

2不,我不会那样做。 iPhone 3将会存在一段时间。 ATT仍在销售它们作为便宜的入门级iPhone。我刚刚看到一个广告,另一个晚上以49美元的价格广告。

3删除Resources条目并将id属性添加到每个类中。你是怎么做的其实很糟糕。只有当几个实体几乎相同并且它们之间只有一些差异时,才应该使用抽象实体。在引擎盖下,Core Data将只为抽象实体及其所有子项创建一个表。所以现在你最终只会得到一个包含你的用户和照片条目的表,当你试图查询实体类型时这可能是坏的。

您还应该删除Image实体并将其属性移动到Photo实体中。 Photo将始终具有与之关联的值,并且不会在照片之间共享相同的值。将它们作为单独的实体将导致减速。您需要使用需要加入(慢速)的照片加载它们,或者当您访问数据或新鲜属性时也会一次加载它们。当在后一种情况下触发每个故障时,将对每个对象进行单独的查询和到磁盘的往返。因此,当您循环显示表格中显示的图片时,您将触发n个查询而不是可能在性能上有很大差异的查询。

4你可以使用KVO来做到这一点。让您的表格单元观察者是用户或图片(取决于您是否已将图片添加到用户并正在更改数据,或者如果您在加载完成时向用户添加新图片)。当观察者被触发时,更新正在显示的图像。