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?

questionAnswers(4)

yourAnswerToTheQuestion