Department
エンティティと 1 対多の関係を持つエンティティがありEmployee
ます。実行時に、オブジェクトごとに、さまざまなビュー オブジェクトでモデルとして使用されるオブジェクトの並べ替えられた配列 (いくつかの属性に従って並べ替えられた)Department
を維持したいと考えています。Employee
私が読んだことから、ソートされた配列を表す方法は 2 つあります。
Rep1 : フェッチされたプロパティを定義しますDepartment
(並べ替えは Core Data によって行われます)。
Rep2:sortedEmployees
Department で(オブジェクトの)インスタンス変数を維持しますNSArray
(ソートは私のコードによって行われます)。Employee
今、私の本当の問題は、アプリの起動時に永続的なストアから多数のDepartments
とをフェッチすることです。Employees
UI をブロックしないように、バックグラウンドで並べ替えを実行したい。
私はいくつかの方法を試しましたが、すべて無駄になりました:
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."
管理対象オブジェクトがスレッドの境界を越えて存在できない場合、管理対象オブジェクトをバックグラウンドでどのようにソートするのでしょうか? 何か不足していますか?