我有一个非常简单的小模式,如下所示:
追踪 - >细分 - >坐标
所有适当的关系都是为了让这项工作成功,他们当然让我做这样的事情:
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运行最少的查询。错误!对这些循环中的每个对象都进行了查询。
我现在阅读有关错误的核心数据文档,我理解发生了什么,虽然我真的想知道处理这种情况的最佳做法是什么。我需要内存中的每个对象(coords模型有~100,000个对象),因为它们都在一个时刻用于在地图上绘制路径。
我应该如何应对这种超懒加载?
答案 0 :(得分:6)
您可以使用setRelationshipKeyPathsForPrefetching:
NSFetchRequest
方法。来自文档:
预取允许Core Data在单个中获取相关对象 获取(每个实体),而不是招致后续访问 在他们的错误被绊倒时存储每个单独的记录。
因此,在初始获取路径的抓取请求中,您可以添加
[request setRelationshipKeyPathsForPrefetching:
[NSArray arrayWithObjects:@"segments", @"segments.coordinates", nil]]
(我从未尝试过2级深度,只有一级。)