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

jar*_*oal 2 core-data objective-c ios

我有一个非常简单的小架构,看起来像这样:

Trail - > Segment - > Coordinate

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

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

来自Django的背景,我很高兴这一点,并假设可能会对sqlite3运行最少的查询.错误!对这些循环中的每个对象都进行了查询.

我现在已经阅读了有关故障的核心数据文档,我理解发生了什么,虽然我真的想知道处理这种情况的最佳实践是什么.我需要内存中的每个对象(coords模型有~100,000个对象)因为它们都在一个时刻用于在地图上绘制一条轨迹.

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

Mar*_*n R 7

您可以使用此setRelationshipKeyPathsForPrefetching:方法NSFetchRequest.从文档:

预取允许Core Data在单个提取(每个实体)中获取相关对象,而不是在其故障被触发时为每个单独的记录引起对存储的后续访问.

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

[request setRelationshipKeyPathsForPrefetching:
    [NSArray arrayWithObjects:@"segments", @"segments.coordinates", nil]]
Run Code Online (Sandbox Code Playgroud)

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