同期を完全に制御できる新しい MOC を作成します。これは呼び出しinit
と同じであり、事前親子関係と同じ動作です。
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSConfinementConcurrencyType];
プロパティを設定して、MOC を別の MOC の親にします。
moc.parentContext = someOtherMocThatIsNowMyParent;
ここでは、子が親を選択します。私の子供たちは、NSManagedObjectContext であることを望んでいるに違いありません。親コンテキストは または のいずれかでなければなりませNSPrivateQueueConcurrencyType
んNSMainQueueConcurrencyType
。
プライベート キューに「バインド」された MOC を作成できます。
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSPrivateQueueConcurrencyType];
performBlock
つまり、またはperformBlockAndWait
API経由でのみアクセスする必要があります。これらのメソッドは、ブロック内のコードの適切なシリアル化を保証するため、任意のスレッドから呼び出すことができます。例えば...
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
との違いはperformBlockAndWait
、performBlock
コードのブロックを作成し、それを 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
またはperformBlockAndWait
APIを介して直接アクセスする必要があります。
これで、メソッドを介して、または既にメイン スレッドで実行されていることがわかっている場合は直接performBlock
、「メイン同時実行」MOC を使用できます。