【发布时间】:2012-03-08 06:36:04
【问题描述】:
我有几个关于 Core Data 行为的“理论”问题,这些问题与一对多关系发生的情况、何时依赖从父实体遍历关系以及何时应该构建新的获取请求有关。它们都非常相关。
背景
假设有一个父实体RPBook,它与RPChapter 具有一对多关系。一本书有很多章节。逆向也在核心数据模型中设置。涉及手动排序关系的基本形式,因此RPChapter 实体具有chapterIndex 属性。我在这里没有使用 iOS5 的新有序关系(也与这些问题无关)。
要访问书中的章节,可以使用chapters 关系访问器:
RPBook *myBook; // Assume this is already set to an existing RPBook
NSSet *myChapters = myBook.chapters
使用/设置
在 iPhone 应用程序中,我们从一个显示RPBook 实例列表的表格视图开始。相应的章节不会作为支持 table view 的 fetched results controller 的 fetch 规范的一部分被预取,因为这些章节还不需要。
我现在选择其中一个RPBook 实例,我被带到一个新页面,我的视图控制器中有这个RPBook 实例引用,它没有预取它的chapters。
问题 1:立即在 chapters 关系上调用 filteredSetUsingPredicate:
如果我想直接使用filteredSetUsingPredicate: 通过chapters 关系进行过滤,考虑到我没有预取当前RPBook 的所有相关RPChapter 实例,这是否还能可靠地工作?看着?换句话说,filteredSetUsingPredicate: 是否会在该关系中的所有对象的幕后触发故障以执行其操作,或者它是否会误导性地仅根据哪些章节已经碰巧在内存中给出结果(如果有) ?
如果我的一本书没有过多的相关章节,我是否应该先调用allObjects 来设置它的样式?即
[[self.chapters allObjects] filteredArrayUsingPredicate:predicate]
而不仅仅是:
[self.chapters filteredSetUsingPredicate:predicate]
问题2:批量检索一本书的所有章节
如果我有一个RPBook 实例,但没有与之相关的预取RPChapter 实例,我如何强制使用chapters 关系一次性获取一本书的所有章节? [myBook.chapters allObjects] 是这样做的,还是我仍然可以从那个电话中得到故障?
我希望 Core Data 批量完成所有故障,而不是根据上面的问题 1 询问是否会影响在 chapters 关系上使用 filteredSetUsingPredicate: 的行为的奇数 RPChapter 跳闸故障.
我必须诉诸明确的获取请求来执行此操作吗?我是否应该重新获取我已经拥有的RPBook,但这次,在获取请求中请求所有相关章节也使用setRelationshipKeyPathsForPrefetching: 获取?
这最后一个选项对我来说似乎很浪费,b/c 我已经有一个范围关系在概念上表示我感兴趣的所有 RPChapter 实例的子集。尽可能多地,我想只是遍历对象图。
问题3:同一线程上RPChapter实例的NSFetchedResultsController
设置
在这种情况下,我有一个 RPBook 实例,但没有与之相关的预取 RPChapter 实例(但它们确实存在于 Store 中)。在同一个视图控制器中,我也有一个 NSFetchedResultsController (FRC) 的 RPChapter 实例,范围是同一本书。所以这是同一个线程,同一个托管对象上下文。
来自 FRC 的 RPChapter 实例是否与我从 myBook.chapters 检索到的 RPChapter 实例对应物在内存中是相同的对象,它共享相同的 ObjectID?换句话说,运行时是否曾经使用内存中的不同物理对象来满足来自同一线程中同一 MOC 的相同ObjectID 的托管对象请求? p>
问题 4:在托管对象中安装 NSFetchedResultsController 以提供关系查询的设计模式
我正在尝试通过使用我的自定义 RPChapter 中提供的内置 chapters 关系来决定是否应该能够处理有关内容经常变化的关系的查询(在我的示例中是书中的章节)托管对象子类,或者如果从设计/体系结构的角度来看可以的话,将FRC 的RPChapter 实例安装到RPBook 托管对象类上,以有效地服务于有关该书中章节的查询。
如果我可以仅依赖 myBook 实例中的 chapters 访问器,显然会更干净,但似乎这里的 FRC 在多对多目标实体中的大量目标实体的情况下实际上可能更高效、更高效关系存在。
这是矫枉过正还是合理使用FRC 以不同方式查询RPBook 的章节?不知何故,感觉就像我错过了简单地遍历对象图的机会。我希望能够相信当我加载我的RPBook 实例时chapters 关系始终是最新的。
【问题讨论】:
标签: core-data ios5 relationship fault prefetch