У меня была такая же проблема (блокировка на psynch_cvwait), когда я сливал изменения контекста (оба пути) между основным и фоновым контекстом (оба с использованием NSConfinementConcurrencyType
). Проблема была вызвана подпиской на NSManagedObjectContextDidSaveNotification
в другой очереди, из которой она была отправлена:
[[NSNotificationCenter defaultCenter]
addObserverForName:NSManagedObjectContextDidSaveNotification
object:mainContext
queue:bgQueue
usingBlock:^(NSNotification * _Nonnull note) {
// bgContext runs on bgQueue
[bgContext mergeChangesFromContextDidSaveNotification:note];
}]
В результате блок никогда не вызывался, и основная и фоновая очереди зависали на psynch_cvwait()
Я исправил это, не блокируя очередь mainContext:
[[NSNotificationCenter defaultCenter]
addObserverForName:NSManagedObjectContextDidSaveNotification
object:mainContext
queue:nil
usingBlock:^(NSNotification * _Nonnull note) {
[bgQueue addOperationWithBlock:^{
[bgContext mergeChangesFromContextDidSaveNotification:note];
}];
}]
Однако, если я блокирую фоновую очередь при объединении изменений в основной контекст, то, похоже, это не проблема.