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?