我正在开发一款允许用户通过照片创建小漫画的应用。我已经实现了CoreData
,因此用户可以保存并重新编辑他们的漫画。我创建了两个实体:ComicInfo
和ComicDetails
,它们彼此之间有关系(我是通过阅读Ray Wenderlich教程这样做的)。因此,当用户保存漫画时,我会制作新的ComicInfo
NSManagedObject
,将名称和缩略图存储在其中,然后创建ComicDetails
NSManagedObject
,存储各种属性那,我将ComicDetails
存储在ComicInfo
中并保存。
我创建了一个UITableView,它显示所有ComicInfo对象的缩略图和名称,以允许用户选择一个,以便他们可以编辑漫画。
我想知道的是,为什么我将它分成两个实体而不是仅仅将它们合二为一?我假设当我从ComicInfos
加载所有CoreData
时,ComicDetails
也会被加载到内存中,或者我错了吗?在一个完美的世界中,我喜欢它,所以只有在ComicInfos
启动时才加载UITableView
,然后当用户选择其中一行时,关联的ComicDetails
将会是加载到内存中。那不是这里发生的事吗?
答案 0 :(得分:4)
拥有两个实体的原因是为了获得您希望的行为。通常,当您执行Core Data fetch时,只会将您请求的实体类型的实例加载到内存中。相关对象不会立即加载。相反,Core Data会根据需要自动加载它们。
在您的情况下,如果您抓取ComicInfos
,则只会加载ComicInfos
。但是,如果您使用其中一个对象并访问其details
属性,则会自动加载相关的ComicDetails
实例,而无需再执行其他操作。只有在您要求时才会加载相关对象。所以,你得到了你想要的行为。
如果您想覆盖此行为,可以使用setRelationshipKeyPathsForPrefetching:
强制NSFetchRequest
不仅加载您实际获取的对象,还加载特定的相关对象。