核心数据中的批处理断层子关系

时间:2012-07-21 16:49:19

标签: objective-c ios core-data

我有一个非常简单的小模式,如下所示:

追踪 - >细分 - >坐标

所有适当的关系都是为了让这项工作成功,他们当然让我做这样的事情:

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个对象),因为它们都在一个时刻用于在地图上绘制路径。

我应该如何应对这种超懒加载?

1 个答案:

答案 0 :(得分:6)

您可以使用setRelationshipKeyPathsForPrefetching: NSFetchRequest方法。来自文档:

  

预取允许Core Data在单个中获取相关对象   获取(每个实体),而不是招致后续访问   在他们的错误被绊倒时存储每个单独的记录。

因此,在初始获取路径的抓取请求中,您可以添加

[request setRelationshipKeyPathsForPrefetching:
    [NSArray arrayWithObjects:@"segments", @"segments.coordinates", nil]]

(我从未尝试过2级深度,只有一级。)