performBlockAndWait erzeugt einen Deadlock
Ich schreibe eine Funktion, die einige CoreData-Aufgaben ausführt. Ich möchte, dass die Funktion nur zurückgegeben wirdnach dem Alle CoreData-Operationen wurden ausgeführt. Das CoreData-Zeug umfasst das Erstellen eines Objekts in einem Hintergrundkontext und das Ausführen weiterer Sachen im übergeordneten Kontext:
+ (void) myFunction
NSManagedObjectContext *backgroundContext = [DatabaseDelegate sharedDelegate].backgroundContext;
[backgroundContext performBlockAndWait:^{
MyObject *bla = create_my_object_in:backgroundContext;
[backgroundContext obtainPermanentIDsForObjects:[[backgroundContext insertedObjects] allObjects] error:nil];
[backgroundContext save:nil];
[[DatabaseDelegate sharedDelegate].parent.managedObjectContext performBlockAndWait:^{
[[DatabaseDelegate sharedDelegate].parent updateChangeCount:UIDocumentChangeDone];
// Do some more stuff
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:someOperation];
}];
}];
return;
}
Ich möchte, dass die Rückkehr erst nach erfolgt[queue addOperation:someOperation]
. Dies scheint in den meisten Fällen zu funktionieren, aber ich hatte einen Fall, in dem diese Funktion nie zurückkehrte. Es schien festgefahren zu sein, und ich vermute, es liegt daranperformBlockAndWait
.
Meine Fragen sind:
(1) Kann jemand erklären, warum dieser Deadlock auftritt?
und
(2) Was ist der richtige Weg, um die gleiche Funktionalität zu erreichen? Voraussetzung ist dasmyFunction
kehrt erst zurück, nachdem beide Sätze ausgeführt wurden.
Vielen Dank!