Core-Daten: Übergeordneter Kontext blockiert untergeordnetes

Ich mache eine Hintergrundverarbeitung in einer App mit Kerndaten. Die Hintergrundverarbeitung wird für einen untergeordneten managedObjectContext ausgeführt. Kontextinitialisierung:

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

Background-Verarbeitung erfolgt in der folgenden Methode:

// 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
    })
}

Der Debugger zeigt, dass sich alle Arbeiten im Block in einem Hintergrundthread befinden.

Wenn ich diese Funktion vom Hauptthread aus aufrufe und den Hauptthread (zu Testzwecken) sofort mit einer längeren Kerndatenoperation blockiere, sehe ich, dass der Hintergrundthread stoppt und die Ausführung nur dann fortsetzt, wenn der Hauptthread inaktiv ist.

// 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.

Warum passiert das?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage