1

Core Data を使用して大量またはレコードを挿入する最良の方法を見つけようとしています。

私は2つのアプローチを試しましたが、より良い方法があるかどうか疑問に思っています。私が試した2つのシナリオは次のとおりです。

前提条件

挿入するデータの構造は次のとおりです。

  • エンティティ: パッケージ、製品
  • 関係:
    • パッケージには 1 つ以上の製品を含めることができます
    • 商品は 1 つのパッケージにのみ含めることができます

インポートするデータは JSON 形式で、プレーン テキスト ファイルです。すべてのパッケージのリスト (つまり、ID、名前のリスト) を含む 1 つのファイルと、パッケージごとの製品のリスト (つまり、パッケージ ID、製品 ID、製品名のリスト) を含む 1 つのファイルがあります。

シナリオ 1

Load the Packages' JSON into an NSArray
Load the Products' JSON into an NSArray
For each Package in Packages array 
  Create Package entity
  Filter Products array using Package Id using NSPredicate
  Create Product entity and associate with current Package
  Save Managed Object Context

シナリオ 2

Load the Packages' JSON into an NSArray
Load the Products' JSON into an NSArray
// insert all Packages first
For each Package in Packages array 
  Create Package entity
  Save Managed Object Context

// insert and associate all Products
For each Product in Products array
  Fetch Packages with package id == current Product's package id
  Create Product entity and associate it with the fetched Package
  Save Managed Object Context

ストレージに大量のデータをロードするためのより良い戦略を知りたいです。

どちらも同期挿入であり、アプリをロックするため、2つの方法のいずれにもあまり満足していません。現在、非同期挿入の作成方法を読んでいますが、まだ完全には理解していません。

4

1 に答える 1

2

まず、並行性: 子コンテキストで挿入を行い、呼び出します

[managedObjectContext performBlock:]

NSNotification またはフェッチされた結果コントローラーのデリゲート メソッドを介して、UI に変更を通知できます。

第二に、インポート戦略: どちらのアプローチも問題ないと思います。どちらのアプローチが速いかは、実際にはデータに依存します。ただし、次の最適化には注意してください。

  1. バッチで保存します。エンティティ数を追跡し、バッチ量がいっぱいの場合は保存します。最速の解決策が見つかるまで実験してください。数百のエンティティ (たとえば 500) から始めますが、理想的な数は 2000 かもしれません。ループ内の反復ごとにコンテキストを保存しないでください。

  2. 子コンテキストで、元に戻すマネージャーをオフにします。これについては、Core Data Programming Guide の「Efficiently Importing Data」を参照してください。(編集: Apple はその後、この情報を削除しました。)

于 2013-09-06T07:38:18.467 に答える