Dados Principais: o contexto pai bloqueia o filho
Estou fazendo um processamento em segundo plano em um aplicativo com dados principais. O processamento em segundo plano é feito em um filho managedObjectContext. Inicialização de contexto:
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
O processamento em segundo plano é feito no seguinte método:
// 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
})
}
O depurador mostra que todo o trabalho dentro do bloco é realmente um encadeamento em segundo plano.
Quando chamo essa função do thread principal e bloqueio imediatamente o thread principal (para fins de teste) com uma operação longa de dados do núcleo, vejo que o thread em segundo plano para e continua a execução apenas quando o thread principal está ocioso.
// 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.
Por que isso está acontecendo?