3

Departmentエンティティと 1 対多の関係を持つエンティティがありEmployeeます。実行時に、オブジェクトごとに、さまざまなビュー オブジェクトでモデルとして使用されるオブジェクトの並べ替えられた配列 (いくつかの属性に従って並べ替えられた)Departmentを維持したいと考えています。Employee

私が読んだことから、ソートされた配列を表す方法は 2 つあります。

Rep1 : フェッチされたプロパティを定義しますDepartment(並べ替えは Core Data によって行われます)。

Rep2:sortedEmployees Department で(オブジェクトの)インスタンス変数を維持しますNSArray(ソートは私のコードによって行われます)。Employee

今、私の本当の問題は、アプリの起動時に永続的なストアから多数のDepartmentsとをフェッチすることです。EmployeesUI をブロックしないように、バックグラウンドで並べ替えを実行したい。

私はいくつかの方法を試しましたが、すべて無駄になりました:

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

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

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

4

1 に答える 1

1

ピウス、

あなたは何も見逃していません。ソートされた配列を新しい MOC に変換するだけです。ここにフラグメントがあります:

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

for (mo in array) {

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

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

アンドリュー

于 2011-11-08T22:26:25.370 に答える