Как определить запущенные в данный момент очереди отправки асинхронного GCD

#iphone #ios #ios4 #grand-central-dispatch

#iPhone #iOS #ios4 #grand-central-dispatch

Вопрос:

В моем приложении iOS есть кнопка обновления, которая запускает очередь асинхронной отправки в GCD. Имя очереди является пользовательским. Могут возникать проблемы, когда пользователь нажимает на кнопку, что приводит к созданию большого количества ненужных очередей. Я надеюсь проверить, активна ли очередь с определенным именем, чтобы я не смог запустить другую очередь или добавить в ту же очередь с тем же именем.

Возможно ли это?

Ответ №1:

Я не думаю, что вам следует создавать новые очереди при каждом запросе. И поскольку вы, похоже, не беспокоитесь о том, что они будут последовательными, поскольку вы создаете новые очереди для выполнения каждого блока, я предлагаю вам использовать глобальные очереди для запуска ваших блоков. Оба действия являются синонимами, поскольку это конечные целевые очереди для создаваемых вами очередей отправки. Получение очереди простое и должно заменить код, в котором вы создаете свою собственную очередь.

 dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
  

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

Ответ №2:

Ну, вы можете поддерживать изменяемый словарь с добавленными объектами

 [dict setobject:<your object> forkey:<the queue name>]
  

Когда вы отправляете последующий запрос, тогда в методе вы можете проверить следующее:

 object = [dict objectforkey:<queue name>]

if (object == nil)
//send the request
  

По завершении работы с очередью удалите пару ключ-объект из словаря.

 [dict removeobjectforkey: < queue name >
  

Ответ №3:

Нет, нет способа получить последовательную очередь из системы по имени. Вам необходимо создать последовательную очередь самостоятельно.