私には2つのモデルがあり、それらの間には多対多の関係があります。モデルAは空の状態で開始しますが、モデルBには約22万件のレコードがあります(非常に大きなインデックスがありますが、このモデルは更新されないため、影響はありません)。
A->Bからのto-manyは次のとおりです。
- オプション=>false
- 一時的=>false
- インデックス付き=>true
- 順序付け=>true
- minCount => 0
- maxCount => NSIntegerMax
- deleteRule => NSCascadeDeleteRule
B->Aからのto-manyは次のとおりです。
- オプション=>true
- 一時的=>false
- インデックス付き=>false
- 順序付け=>false
- minCount => 0
- maxCount => NSIntegerMax
- deleteRule => NSNullifyDeleteRule
そしてもちろん、それぞれの関係は他の関係の逆として設定されます。私が直面している問題は次のとおりです。新しいエンティティAを作成する前に、アプリはエンティティBの約2,000レコードを取得するフェッチリクエストを実行します。次に、アプリはこれらのレコードを作成しようとしているエンティティAに設定します。次に、コンテキストを保存します。問題は、2kレコードのnsorderedsetをエンティティに設定することです。iOS6.0.1を搭載したiPhone 4Sではインスタンスに4秒程度かかり、同じデバイスではコンテキストの保存にさらに4秒かかります。これにより、モデルAの新しいインスタンスを作成するのに8秒かかります。
モデルAでインデックス付きの関連付けプロパティを有効/無効にしようとしましたが、そのような違いはありませんでした。私が達成しようとしているのはとても重い仕事ですか?
いくつかのテストを行ったところ、nsorderedsetをエンティティAインスタンスに設定するのにほとんどの時間が失われたのは、逆の関係が原因であることがわかりました。ターゲットモデルで多対多の関係を逆の関係のない多対多に変更する簡単なテストを行ったところ、挿入時間は半分の時間に短縮されました。もちろん、これは多対多の関係を壊します。簡単なテストでした。
ここで何かが足りませんか?アプリはコンテキストを1回だけ保存し、各レコードBごとに1回ではないので、2kレコードを保存するのにそれほど時間はかからないはずですが、私はiPhone開発に不慣れであり、おそらくこのタスクを実行しています。この種のデバイスには多すぎます。
どんなヒントも大いに評価されるでしょう。ありがとう!