我有一个非常简单的小模式,如下所示:
轨迹 --> 线段 --> 坐标
所有适当的关系都已到位以完成这项工作,他们当然让我做这样的事情:
NSArray *trails = <query all trails>
for (Trail *trail in trails) {
for (Segment *segment in trail.segments) {
for (Coordinate *coordinate in segment.coordinates) {
//do something with coords
}
}
}
来自 Django 的背景,我对此感到很高兴,并假设将对 sqlite3 运行尽可能少的查询。错误的!对这些循环中的每个对象都进行了查询。
我现在已经阅读了关于故障的 Core Data 文档,我明白发生了什么,尽管我真的很想知道处理这种情况的最佳实践是什么。我需要内存中的每个对象(坐标模型有大约 100,000 个对象),因为它们都在同一时刻用于在 map 上绘制轨迹。
我应该如何处理这种超延迟加载?
最佳答案
为此,您可以使用 NSFetchRequest
的 setRelationshipKeyPathsForPrefetching:
方法。来自文档:
Prefetching allows Core Data to obtain related objects in a single fetch (per entity), rather than incurring subsequent access to the store for each individual record as their faults are tripped.
因此,在您对路径的初始提取请求中,您可以添加
[request setRelationshipKeyPathsForPrefetching:
[NSArray arrayWithObjects:@"segments", @"segments.coordinates", nil]]
(我从来没有尝试过 2 层深,只有一层。)
关于objective-c - 核心数据中的批量故障子关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11594065/