0

指定されたコンテキストの適切なキューで変更が行われるように、を使用performBlockしています。NSManagedObjectContexts私の質問は、多くの変更を加えて内部からメソッドを呼び出すperformBlock場合、適切なコンテキストのオブジェクトを使用することを保証する簡単な方法があるかどうかです。

例:

アプリケーションの現在のアカウント用のiVar activeAccount(メインキューで作成)があります。オブジェクトを使用して特定のタスク(データの取得、データの設定)を実行NSMangedObjectするインスタンスメソッドがいくつかあります。activeAccountだから私の質問は、私がバックグラウンドで何かをしていてNSManagedObjectContext、これらの共有メソッドの1つを呼び出すかどうかです-これらのメソッドで現在のactiveAccountiVarを使用するか、新しいものを取得するかを知るために使用できるパターンはありますか?また、必要なことを行う必要がある場合は、NSManagedObjectContextどれを取得/使用するかをどのように知ることができますか。

どちらを使用するかを知るための1つのメソッドはNSManagedObjectContext、現在のスレッドで実行されているかどうかをチェックするメソッドがあります。これにより、メインスレッドのコンテキストまたはバックグラウンドスレッドのコンテキストを返すことがわかります。また、バックグラウンドスレッドを使用している場合、メインスレッドに存在するオブジェクトIDを読み取ってactiveAccount、バックグラウンドスレッドでそのコピーを取得できるようにすることはできますか?前もって感謝します。

4

2 に答える 2

0

ブライアン、

スレッドの制限は、維持するのが難しい命題になる可能性があります。維持する必要がある重要なことは、適切な MOC でオブジェクトを使用することです。すべての管理対象オブジェクトは、そのホスト MOC とそのオブジェクト ID の両方へのリンクを保持しているため、これを確認するのは非常に簡単です。例えば:

NSManagedObjectContext *newMOC = NSManagedObjectContext.new;

newMOC.persistentStoreCoordinator = oldActiveAccount.managedObjectContext.persistentStoreCoordinator;

ActiveAccount *newActiveAccount = [newMOC objectWithID: oldActiveAccount.objectID];

アクセス元のすべてのインスタンスnewActiveAccountは で作成されるnewMOCため、スレッドはその MOC に限定されます。objectIDは永続的です。が で変更される-persistentStoreCoordinatorことはほとんどありませんmainMOC。したがって、上記のコードは適切に制限されています。ソース MOC が一時的な場合、上記の手法には問題があります。したがって、上記のコードが 2 つのバックグラウンド MOC に対して機能することは保証できません。

アンドリュー

于 2012-06-25T15:41:44.147 に答える
0

最初に尋ねなければならないのは、なぜ同時に多くのコンテキストを使用しているのですか?

1 つはバックグラウンド操作用、もう 1 つはメイン スレッド用です。破棄可能な変更のために別のものを作成する必要がある場合は、それを作成して渡すだけなので、self.managedObjectContext はドラフト コンテキストを指します。管理対象オブジェクトが多数のコンテキストにアクセスできるスコープに存在することは決してありません。

iOS 向けに書いているのか、OSX 向けに書いているのかは完全には明らかではありませんが、たとえば iOS の場合は次のようになります。

新しいビュー コントローラーをナビゲーション スタックにプッシュする必要がある場合は、宛先ビュー コントローラーの managedObjectContext ivar と NSManagedObject サブクラス インスタンスを初期化します。-prepareForSegue: では、ドラフト コンテキストを作成するか、現在のコンテキストを単に渡すかを知っています。また、新しく作成したコンテキストから ID で参照して管理オブジェクト インスタンスを初期化する必要があるかどうか、または単に渡すことができるかどうかもわかっています。それらをオンにします。

これで、View Controller 内で、マネージド オブジェクトが常に self.managedObjectContext に関連付けられていることを当然のことと考えることができます。

于 2012-06-26T09:39:57.167 に答える