Как я могу проверить, что я работаю в данной очереди GCD без использования dispatch_get_current_queue ()?

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

Я использовал код, подобный следующему, чтобы сделать это:

void runSynchronouslyOnVideoProcessingQueue(void (^block)(void))
{
    dispatch_queue_t videoProcessingQueue = [GPUImageOpenGLESContext sharedOpenGLESQueue];

    if (dispatch_get_current_queue() == videoProcessingQueue)
    {
        block();
    }
    else
    {
        dispatch_sync(videoProcessingQueue, block);
    }
}

Эта функция основана на использованииdispatch_get_current_queue() чтобы определить идентичность очереди, в которой выполняется эта функция, и сравнивает ее с целевой очередью. Если там'Если он совпадает, он знает, что нужно просто запустить блок без отправки в эту очередь, потому что функция уже запущена в нем.

мы слышали противоречивые мнения о том, правильно ли это использоватьdispatch_get_current_queue() сделать сравнения, как это, и я вижу эту формулировку в заголовках:

Рекомендуется только для целей отладки и ведения журнала:

Код не должен делать никаких предположений о возвращаемой очереди, если только это не одна из глобальных очередей или очередь, которую сам код создал. Код не должен предполагать, что синхронное выполнение в очереди защищено от тупиковой ситуации, если эта очередь не та, которую возвращает dispatch_get_current_queue ().

Кроме того, в iOS 6.0 (но пока не для Mountain Lion) заголовки GCD теперь помечают эту функцию как устаревшую.

Похоже, я не должен использовать эту функцию таким образом, но яЯ не уверен, что я должен использовать на своем месте. Для функции, подобной приведенной выше, предназначенной для основной очереди, я мог бы использовать[NSThread isMainThread], но как я могу проверить,работает в одной из моих пользовательских последовательных очередей, чтобы я мог предотвратить взаимоблокировку?

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

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