executeBlockAndWait создает тупик

Я пишу функцию, которая выполняет некоторые вещи CoreData. Я хочу, чтобы функция возвращала толькоafter все операции CoreData выполнены. Материал CoreData включает в себя создание объекта в фоновом контексте, а затем делает некоторые другие вещи в родительском контексте:

+ (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;
}

Я хочу, чтобы возвращение произошло только после[queue addOperation:someOperation]. This seems to work most of the cases, but I have had one case when this function never returned. It seemed like it was deadlocked, and I suspect it is because of performBlockAndWait.

Мои вопросы:

(1) Может кто-нибудь объяснить, почему возникает этот тупик?

а также

(2) Как правильно достичь такой же функциональности? Требование заключается в том, чтоmyFunction возвращает только после того, как оба блока были выполнены.

Спасибо!

Ответы на вопрос(2)

Ваш ответ на вопрос