12

「子」MOC (永続ストアとして他の MOC を使用する MOC) を作成できるというビデオやスレッドをいくつか見ました。たとえば、アプリケーションをスレッド化していて、子スレッドが作成した変更を保存/ロールバックできる単一のマスター MOC が必要な場合に役立ちます。(私が理解していることから、MOC とその managedObjects はすべて同じスレッドで使用する必要があります)

問題は、子 MOC を作成するにはどうすればよいかということです。私が見ていた WWDC ビデオでそれらを紹介したものを追跡することはできません。私が見たものはすべて、作成された後の使用方法について話していました。新しい MOC を簡単に割り当てることができますが、どのように設定すればよいですか?永続ストアを別の MOC にするには? リファレンスには、それを行う関数は示されていません!

4

2 に答える 2

37

同期を完全に制御できる新しい MOC を作成します。これは呼び出しinitと同じであり、事前親子関係と同じ動作です。

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc]
       initWithConcurrencyType:NSConfinementConcurrencyType];

プロパティを設定して、MOC を別の MOC の親にします。

moc.parentContext = someOtherMocThatIsNowMyParent;

ここでは、子が親を選択します。私の子供たちは、NSManagedObjectContext であることを望んでいるに違いありません。親コンテキストは または のいずれかでなければなりませNSPrivateQueueConcurrencyTypeNSMainQueueConcurrencyType

プライベート キューに「バインド」された MOC を作成できます。

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc]
       initWithConcurrencyType:NSPrivateQueueConcurrencyType];

performBlockつまり、またはperformBlockAndWaitAPI経由でのみアクセスする必要があります。これらのメソッドは、ブロック内のコードの適切なシリアル化を保証するため、任意のスレッドから呼び出すことができます。例えば...

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc]
       initWithConcurrencyType:NSPrivateQueueConcurrencyType];
moc.parentContext = someOtherMocThatIsNowMyParent;
[moc performBlock:^{
    // All code running in this block will be automatically serialized
    // with respect to all other performBlock or performBlockAndWait
    // calls for this same MOC.
    // Access "moc" to your heart's content inside these blocks of code.
}];

performBlockとの違いはperformBlockAndWaitperformBlockコードのブロックを作成し、それを Grand Central Dispatch でスケジュールして、将来のある時点で未知のスレッドで非同期に実行することです。メソッド呼び出しはすぐに戻ります。

performBlockAndWait他のすべての呼び出しと魔法の同期を行いperformBlock、このブロックより前に提示されたすべてのブロックが完了すると、このブロックが実行されます。呼び出しスレッドは、この呼び出しが完了するまで保留されます。

プライベート コンカレンシーと同様に、メイン スレッドに「バインド」された MOC を作成することもできます。

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc]
       initWithConcurrencyType:NSMainQueueConcurrencyType];
moc.parentContext = someOtherMocThatIsNowMyParent;
[moc performBlock:^{
    // All code running in this block will be automatically serialized
    // with respect to all other performBlock or performBlockAndWait
    // calls for this same MOC.  Furthermore, it will be serialized with
    // respect to the main thread as well, so this code will run in the
    // main thread -- which is important if you want to do UI work or other
    // stuff that requires the main thread.
}];

つまり、メイン スレッド上にいることがわかっている場合、またはperformBlockまたはperformBlockAndWaitAPIを介して直接アクセスする必要があります。

これで、メソッドを介して、または既にメイン スレッドで実行されていることがわかっている場合は直接performBlock、「メイン同時実行」MOC を使用できます。

于 2012-09-04T22:10:19.867 に答える
1

次に、子MOCを初期化します。

[_childMOC performBlockAndWait:^{
            [_childMOC setParentContext:parentMOC]; 
 }];
于 2012-09-04T21:38:19.587 に答える