2

私は現在、CoreDataを使用してiOSアプリに取り組んでいます。

アプリを初めて起動すると、RESTfulWebサービスに対して一連のWeb要求が行われます。

Webサービスは、2000以上のレコードを含むことができる一連のjson応答を提供します。

次に、これらのレコードが解析され、さまざまなコアデータエンティティに変換され、SQLite永続ストア内に保存されます。

この操作が完了したら、エンティティA内のすべての行をフェッチしてオブジェクトグラフを作成し(たとえば)、後で使用するオブジェクトグラフを作成します。

何らかの理由で、エンティティA内に格納されているすべてのNSManagedObjectを反復処理しているときに、一部のNSManagedObjectにプロパティ値がありません。

マルチスレッド環境で作業していることを考えると、別々のスレッドで別々のmanagedObjectContextsを作成していることを確認しました-ただし、最新のテスト実行中に、1つのスレッドのみがSQLite永続ストアから一度にデータを保存/取得します。

[context save:...]また、json応答で返される2000以上のレコードをすべて解析するまで、操作を実行しないことにも注意してください。

何度か試行錯誤した結果、挿入ごとに保存を実行することで問題が解決することに気付きました。

たとえば、次のコードは問題なく機能します。

NSManagedObjectContext *context = ...
NSError *error = ...

for(id record in collectionOfRecords){
    //create entity for insertion
    [context save:&error]
}

ただし、これにより、プロパティ値が欠落するという問題が発生します。

NSManagedObjectContext *context = ...
NSError *error = ...

for(id record in collectionOfRecords){
    //create entity for insertion     
}
[context save:&error]

質問:

操作を実行する前にメモリに配置できるNSManagedObjectの最大数は[NSManagedObjectContext save:...]ありますか?

4

1 に答える 1

3

質問に答えるには:保存が必要になる前にメモリに保存できる管理対象オブジェクトの数に制限はありません。アプリケーションは、必要なだけ保存せずに管理対象オブジェクトを作成できます。メモリが不足すると、iOSアプリケーションで発生する可能性のある通常のメモリ警告が表示されるようになります。理想的には、これが発生しないようにする必要があります。また、メモリの警告に反応してコンテキストの保存やコンテキストのリセットを行うことも、おそらくあまり良い考えではありません。

ただし、詳細で説明しているシナリオは、Appleのドキュメントでカバーされています。

Core Dataプログラミングガイド:データを効率的にインポートする

そして、ここに関連するものがもっとあります:

Core Dataプログラミングガイド:CoreDataのパフォーマンス

あなたの場合、より頻繁に保存し、複数のスレッドで作業を行う必要があります。つまり、1つのスレッドからのみストレージにアクセスしているということです。これは、おそらく問題の大部分を占めています。スレッドBのコンテキストでスレッドAのコンテキストから変更を取得していないようです-NSManagedObjectContextObjectsDidChangeNotificationは、古いスレッド制限モデルを使用する場合の主な方法です。

于 2013-03-18T21:58:02.133 に答える