2

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

轨迹 --> 段 --> 坐标

所有适当的关系都已到位,可以完成这项工作,他们当然让我做这样的事情:

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 运行尽可能少的查询。错误的!对这些循环中的每个对象都有一个查询。

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

我应该如何处理这种超延迟加载?

4

1 回答 1

7

你可以使用这个setRelationshipKeyPathsForPrefetching:方法NSFetchRequest。从文档中:

预取允许 Core Data 在一次提取(每个实体)中获取相关对象,而不是在触发错误时为每个单独的记录引发对存储的后续访问。

因此,在您可以添加的跟踪的初始获取请求中

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

(我从来没有尝试过 2 个级别的深度,只有一个级别。)

于 2012-07-21T17:03:19.793 回答