Ответ 1
Создайте новый MOC, для которого вы полностью контролируете синхронизацию. Это то же самое, что и вызов init
и такое же поведение, как отношения между родителями и дочерними элементами.
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSConfinementConcurrencyType];
Вы родите MOC другому MOC, установив его свойство:
moc.parentContext = someOtherMocThatIsNowMyParent;
Здесь ребенок выбирает родителя. Я уверен, что мои дети хотят, чтобы они были NSManagedObjectContexts. Родительский контекст должен быть либо NSPrivateQueueConcurrencyType
, либо NSMainQueueConcurrencyType
.
Вы можете создать MOC, привязанный к частной очереди:
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSPrivateQueueConcurrencyType];
что означает, что вы должны получить доступ к нему только через API performBlock
или performBlockAndWait
. Вы можете вызвать эти методы из любого потока, поскольку они обеспечат правильную сериализацию кода в блоке. Например...
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 content inside these blocks of code.
}];
Разница между performBlock
и performBlockAndWait
заключается в том, что performBlock
создаст блок кода и запланирует его с помощью Grand Central Dispatch, который будет выполняться асинхронно в будущем в неизвестном потоке. Вызов метода немедленно вернется.
performBlockAndWait
выполнит некоторую магическую синхронизацию со всеми другими вызовами performBlock
, и когда все блоки, которые были представлены до этого, будут выполнены, этот блок будет выполнен. Вызывающий поток будет отложен до завершения этого вызова.
Вы также можете создать MOC, привязанный к основному потоку, точно так же, как частный concurrency.
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.
}];
что означает, что вы должны обращаться к нему напрямую, если знаете, что находитесь в основном потоке, или с помощью API performBlock
или performBlockAndWait
.
Теперь вы можете использовать "main concurrency" MOC либо с помощью методов performBlock
, либо напрямую , если, вы знаете, что вы уже работаете в основном потоке.