Как реализовать механизм блокировки реентерабельной системы в target-c через GCD?

У меня есть классjective-c с некоторыми методами, которые используют очередь GCD для обеспечения последовательного доступа к ресурсу последовательно (стандартный способ сделать это).

Некоторые из этих методов должны вызывать другие методы того же класса. Таким образом, механизм блокировки должен быть входящим. Есть ли стандартный способ сделать это?

Сначала я использовал каждый из этих методов

dispatch_sync(my_queue, ^{

   // Critical section

});

синхронизировать доступы. Как вы знаете, когда один из этих методов вызывает другой такой метод, возникает тупик, потому что вызов dispatch_sync останавливает текущее выполнение до тех пор, пока не будет выполнен этот другой блок, который также не может быть выполнен, потому что выполнение в очереди остановлено. Чтобы решить эту проблему, я использовал, например, Этот способ:

- (void) executeOnQueueSync:(dispatch_queue_t)queue : (void (^)(void))theBlock {
    if (dispatch_get_current_queue() == queue) {
        theBlock();
    } else {
        dispatch_sync(queue, theBlock);
    }
}

И в каждом из моих методов я использую

[self executeOnQueueSync:my_queue : ^{

   // Critical section

}];

Мне не нравится это решение, потому что для каждого блока с разным типом возврата мне нужно написать другой метод. Более того, эта проблема выглядит очень распространенной для меня, и я думаю, что для этого должно быть более подходящее стандартное решение.

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

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