Проверка равенства на 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() для, ну, что угодно. Это просто для целей отладки, и его использование всегда было обескуражено.