3

Employeeエンティティと1対多の関係を持つDepartmentエンティティがあります。実行中、各Departmentオブジェクトに対して、さまざまなビューオブジェクトのモデルとして使用されるEmployeeオブジェクト(ソートされたいくつかの属性に従ってソートされた配列)を維持する必要があります。コアデータのバックグラウンドソート

REP1:私はソートされた配列表現には二つの方法がある読んだから

(ソートは、コアデータによって行われる)Departmentにフェッチされたプロパティを定義するが、

REP2:部門における(EmployeeオブジェクトのNSArraysortedEmployees変数インスタンス(ソートは私のコードによって行われる)を維持します。

私の本当の問題は、アプリケーションが起動するときに、永続ストアからフェッチするために多数のDepartmentsEmployeesがあることです。バックグラウンドで並べ替えを実行して、UIをブロックしないようにしたい。

私はすべてが無益で終わったいくつかの方法試してみました:(REP1を使用して)

方法1:(NSOperationQueueを使用して)バックグラウンドスレッドでは、各1のフェッチされたプロパティを実行し、すべてのDepartmentsをフェッチします。その後、メインスレッドに戻って、メインスレッドの管理オブジェクトコンテキスト(MOC)(NSManagedObjectID)に対応するDepartmentオブジェクトを見つけ、取り出したプロパティを使用します。 Method1の問題:バックグラウンドDepartmentのフェッチが完了した後でも、メインスレッドのDepartmentオブジェクトのフェッチされたプロパティが設定されません。つまり、メインスレッドのDepartmentに再フェッチされます。これは、バックグラウンドフェッチの全目的を破ります。一度フェッチされたプロパティがすべてのMOCに存在すると仮定すると間違っていますか? (REP2を使用して)

方法2:バックグラウンドスレッド(NSOperationQueueを使用して)で、それぞれのsortedEmployeesアレイを計算し、その後、全てDepartmentsをフェッチします。その後、メインスレッドに戻り、メインスレッドのMOCNSManagedObjectID)の対応するDepartmentオブジェクトを見つけて、にこのオブジェクトをに設定します。 Method2の問題:sortedEmployees配列のオブジェクトは、Employeeオブジェクトであり、バックグラウンドスレッドのMOCに属しています。メインスレッドが後でそれらにアクセスしようとすると、"NSManagedObject with ID ... has been invalidated."などのクラッシュが発生します。これは、各スレッドが独自のMOC(および関連する管理対象オブジェクト)を持っている必要があるためです。

管理対象オブジェクトがスレッド境界を越えて存在できない場合、どのように管理対象オブジェクトをバックグラウンドで並べ替えるのですか?何か不足していますか?

答えて

1

ピウス、

あなたは何も欠けていません。ソートされた配列を新しいMOCに変換するだけで済みます。フラグメントは次のとおりです。

NSMutableArray *ma = [NSMutableArray arrayWithCapacity: array.count]; 

for (mo in array) { 

    [ma addObject: [moc objectWithID: mo.objectID]]; 
} 
return ma; 

これでアレイが移行されます。私が理解しているように、これは効率的なプロセスです。さらに、プロパティへの高性能アクセスのために、行キャッシュに依存することができます。

アンドリュー

+0

ありがとう。あなたは行のキャッシュに応じてあなたが意味することを詳しく説明できますか?どのような行キャッシュですか? – Pius

+0

また、前述のアレイの移行をどのスレッドで実行する必要がありますか?メインスレッドの場合は、mo.objectIDにアクセスすると "mo"が無効になり、エラーが発生しませんか?バックグラウンドスレッドの場合は、mocがメインスレッドに属しているため、[moc objectWithID:...]にアクセスできませんか? – Pius

+0

Pius、行キャッシュは永続的なストアコーディネータによって維持されます。自動パフォーマンスの最適化です。あなたはそれを維持していません - コアデータはそうです。私は通常、ターゲットスレッド上にいるときにIDを変換します。アンドリュー・P.S.この回答が気に入ったら、「正しい」回答として選択してください。 – adonoho