Employee
エンティティと1対多の関係を持つDepartment
エンティティがあります。実行中、各Department
オブジェクトに対して、さまざまなビューオブジェクトのモデルとして使用されるEmployee
オブジェクト(ソートされたいくつかの属性に従ってソートされた配列)を維持する必要があります。コアデータのバックグラウンドソート
REP1:私はソートされた配列表現には二つの方法がある読んだから
(ソートは、コアデータによって行われる)Department
にフェッチされたプロパティを定義するが、
REP2:部門における(Employee
オブジェクトのNSArray
)sortedEmployees
変数インスタンス(ソートは私のコードによって行われる)を維持します。
私の本当の問題は、アプリケーションが起動するときに、永続ストアからフェッチするために多数のDepartments
とEmployees
があることです。バックグラウンドで並べ替えを実行して、UIをブロックしないようにしたい。
私はすべてが無益で終わったいくつかの方法試してみました:(REP1を使用して)
方法1:(NSOperationQueue
を使用して)バックグラウンドスレッドでは、各1のフェッチされたプロパティを実行し、すべてのDepartments
をフェッチします。その後、メインスレッドに戻って、メインスレッドの管理オブジェクトコンテキスト(MOC)(NSManagedObjectID)に対応するDepartment
オブジェクトを見つけ、取り出したプロパティを使用します。 Method1の問題:バックグラウンドDepartmentのフェッチが完了した後でも、メインスレッドのDepartmentオブジェクトのフェッチされたプロパティが設定されません。つまり、メインスレッドのDepartmentに再フェッチされます。これは、バックグラウンドフェッチの全目的を破ります。一度フェッチされたプロパティがすべてのMOCに存在すると仮定すると間違っていますか? (REP2を使用して)
方法2:バックグラウンドスレッド(NSOperationQueue
を使用して)で、それぞれのsortedEmployees
アレイを計算し、その後、全てDepartments
をフェッチします。その後、メインスレッドに戻り、メインスレッドのMOC(NSManagedObjectID)の対応するDepartmentオブジェクトを見つけて、にこのオブジェクトをに設定します。 Method2の問題:sortedEmployees
配列のオブジェクトは、Employee
オブジェクトであり、バックグラウンドスレッドのMOCに属しています。メインスレッドが後でそれらにアクセスしようとすると、"NSManagedObject with ID ... has been invalidated."
などのクラッシュが発生します。これは、各スレッドが独自のMOC(および関連する管理対象オブジェクト)を持っている必要があるためです。
管理対象オブジェクトがスレッド境界を越えて存在できない場合、どのように管理対象オブジェクトをバックグラウンドで並べ替えるのですか?何か不足していますか?
ありがとう。あなたは行のキャッシュに応じてあなたが意味することを詳しく説明できますか?どのような行キャッシュですか? – Pius
また、前述のアレイの移行をどのスレッドで実行する必要がありますか?メインスレッドの場合は、mo.objectIDにアクセスすると "mo"が無効になり、エラーが発生しませんか?バックグラウンドスレッドの場合は、mocがメインスレッドに属しているため、[moc objectWithID:...]にアクセスできませんか? – Pius
Pius、行キャッシュは永続的なストアコーディネータによって維持されます。自動パフォーマンスの最適化です。あなたはそれを維持していません - コアデータはそうです。私は通常、ターゲットスレッド上にいるときにIDを変換します。アンドリュー・P.S.この回答が気に入ったら、「正しい」回答として選択してください。 – adonoho