当在CoreData中获取实体时,实体关系是否也会加载到内存中?

时间:2013-12-11 03:51:16

标签: ios iphone cocoa-touch core-data

我正在开发一款允许用户通过照片创建小漫画的应用。我已经实现了CoreData,因此用户可以保存并重新编辑他们的漫画。我创建了两个实体:ComicInfoComicDetails,它们彼此之间有关系(我是通过阅读Ray Wenderlich教程这样做的)。因此,当用户保存漫画时,我会制作新的ComicInfo NSManagedObject,将名称和缩略图存储在其中,然后创建ComicDetails NSManagedObject,存储各种属性那,我将ComicDetails存储在ComicInfo中并保存。

我创建了一个UITableView,它显示所有ComicInfo对象的缩略图和名称,以允许用户选择一个,以便他们可以编辑漫画。

我想知道的是,为什么我将它分成两个实体而不是仅仅将它们合二为一?我假设当我从ComicInfos加载所有CoreData时,ComicDetails也会被加载到内存中,或者我错了吗?在一个完美的世界中,我喜欢它,所以只有在ComicInfos启动时才加载UITableView,然后当用户选择其中一行时,关联的ComicDetails将会是加载到内存中。那不是这里发生的事吗?

1 个答案:

答案 0 :(得分:4)

拥有两个实体的原因是为了获得您希望的行为。通常,当您执行Core Data fetch时,只会将您请求的实体类型的实例加载到内存中。相关对象不会立即加载。相反,Core Data会根据需要自动加载它们。

在您的情况下,如果您抓取ComicInfos,则只会加载ComicInfos。但是,如果您使用其中一个对象并访问其details属性,则会自动加载相关的ComicDetails实例,而无需再执行其他操作。只有在您要求时才会加载相关对象。所以,你得到了你想要的行为。

如果您想覆盖此行为,可以使用setRelationshipKeyPathsForPrefetching:强制NSFetchRequest不仅加载您实际获取的对象,还加载特定的相关对象。