Проверка равенства на dispatch_queue_t

Как я могу проверить равенство между dispatch_queue_t vars?

dispatch_queue_t currentQueue = dispatch_get_current_queue();
dispatch_queue_t mainQueue = dispatch_get_main_queue();
if (currentQueue == mainQueue) {

}

из документов:

typedef struct dispatch_queue_s *dispatch_queue_t;

Я не уверен, но означает ли это, что это указатель на структуру dispatch_queue_s?

Так как я не могу проверить равенство по указателям, я не уверен, как проверить, является ли dispatch_queue_t тем же самым, что и другой?

Ответ 1

Это зависит от очереди, в которой вы находитесь. В этом конкретном случае используйте:

if ([NSThread isMainThread]) {}

В общем, вы можете использовать dispatch_get_current_queue() для проверки того, в какой очереди вы находитесь. В этом случае вы можете использовать оператор == для этого. Чтобы процитировать страницу "Очереди отправки" в Apple Concurrency Руководство по программированию:

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

Ответ 2

Так как dispatch_get_current_queue() устарел, мы могли бы сравнить текущие и ваши очереди по их меткам (или спецификациям, предложенным @jkh)

Для использования меток

dispatch_queue_get_label(dispatch_queue_t queue);

и передать DISPATCH_CURRENT_QUEUE_LABEL для получения метки текущей очереди

Для конкретного:

dispatch_queue_get_specific(dispatch_queue_t queue, const void *key);

чтобы получить определенную очередь в очереди и

dispatch_get_specific(const void *key);

для текущего

Требуется установить одну или обе метки и указать для вашей очереди. Например, когда вы его создаете

dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);

или используя сеттеры для конкретных

dispatch_queue_set_specific(dispatch_queue_t queue, const void *key,
    void *context, dispatch_function_t destructor);

Ответ 3

Первая часть ответа: что вы пытаетесь сделать? Зачем вам сравнивать очереди? Если все, что вам нужно сделать, это "пометить" очередь отдельными метаданными, попробуйте вместо этого использовать dispatch_queue_ {set, get} _specific().

Вторая часть ответа: Не используйте dispatch_get_current_queue() для, ну, что угодно. Это просто для целей отладки, и его использование всегда было обескуражено.