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に対して実行される可能性のあるクエリが最も少ないと想定しました。間違い!これらのループ内のすべてのオブジェクトに対して行われるクエリがあります。

障害に関するコアデータのドキュメントを読みました。何が起こっているのかを理解していますが、このような状況に対処するためのベストプラクティスを知りたいと思います。マップ上に軌跡をプロットするためにすべてのオブジェクトが一度に使用されるため、メモリ内のすべてのオブジェクトが必要です(coordsモデルには最大100,000個のオブジェクトがあります)。

この超遅延読み込みにどのように対処する必要がありますか?

4

1 に答える 1

7

setRelationshipKeyPathsForPrefetching:このための方法を使用できますNSFetchRequest。ドキュメントから:

プリフェッチにより、Core Dataは、障害が発生したときに個々のレコードごとにストアへの後続のアクセスを発生させるのではなく、1回のフェッチ(エンティティごと)で関連オブジェクトを取得できます。

したがって、トレイルの最初のフェッチリクエストで追加できます

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

(私はこれを2レベルの深さで試したことはなく、1レベルだけで試しました。)

于 2012-07-21T17:03:19.793 に答える