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!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage