Основные данные: родительский контекст блокирует дочерний
Я делаю некоторую фоновую обработку в приложении с основными данными. Фоновая обработка выполняется для дочернего управляемогоObjectContext. Инициализация контекста:
appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
// the moc in appDelegate is created with .MainQueueConcurrencyType
mainThreadMOC = appDelegate.managedObjectContext!
backgroundMOC = NSManagedObjectContext(concurrencyType:NSManagedObjectContextConcurrencyType.PrivateQueueConcurrencyType)
backgroundMOC?.parentContext = mainThreadMOC
Фоновая обработка выполняется следующим способом:
// download all new transaction log entries
func syncItems() {
... set up the query object for parse
let moc = CoreDataStore.sharedInstance.backgroundMOC
// perform download
moc?.performBlock( {
self.runQuery(query) // Download stuff und do some core data work
})
}
Отладчик показывает, что вся работа внутри блока действительно в фоновом потоке.
Когда я вызываю эту функцию из основного потока и немедленно блокирую основной поток (в целях тестирования) с помощью длительной операции с основными данными, я вижу, что фоновый поток останавливается и продолжает выполнение, только когда основной поток простаивает.
// this is called from a view controller in the main thread
syncItems() // should start to work in background
for i in 0...200 {
// do some core data work in main thread
}
// syncItems starts to work after the blocking for-loop ends.
Почему это происходит?