У меня есть приложение OSX, где я использую настройку NSManagedObjectContext для родительского/дочернего объекта. У ребенка MOC есть NSPrivateQueueConcurrencyType
и тот, который я использую в первую очередь. Родитель устанавливается равным NSMainQueueConcurrencyType
NSManagedObjectContext performBlockAndWait вызывает тупик при вызове из двух потоков
Когда я звоню performBlockAndWait
от контекста ребенка от фонового потока в то же время, как она вызывается из основного потока я получаю тупик - semaphore_wait_trap
. Приостановка отладчика показывает, что оба потока застревают в performBlockAndWait
Как я могу обойти это? Я думал, что этот метод был разработан именно для этой ситуации и будет просто помещать блоки в частную очередь контекста, а затем возвращаться соответствующим образом?
hmm Я могу попробовать и переключить свой код на выполнение. Блокировать да, определенно будет немного дольше с обратными вызовами и т. Д., Но вполне возможно, я уверен. Итак, используя этот метод, блоки будут выполняться в потокобезопасном режиме? –
performBlock and performBlockAndWait просто убедитесь, что блок, который вы передаете в них, выполняется в правильной очереди, связанной с контекстом управляемого объекта. Так что да, ваши блоки будут выполняться поточно-безопасным образом в контексте - разница в семантике вашего кода и если вам нужно заблокировать и ждать завершения блока. Я всегда стремился сначала использовать executeBlock и использовать executeBlockAndWait, если бы мне пришлось по какой-то причине. См. Http://developer.apple.com/library/mac/#releasenotes/DataManagement/RN-CoreData/index.html. – bandejapaisa