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

Я пишу функцию, которая выполняет некоторые вещи CoreData. Я хочу, чтобы функция возвращала толькопосле все операции 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], Кажется, это работает в большинстве случаев, но у меня был один случай, когда эта функция никогда не возвращалась. Казалось, что он зашел в тупик, и я подозреваю, что это из-за.performBlockAndWait

Мои вопросы:

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

а также

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

Спасибо!

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

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