2013-07-17 2 views
18

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

Прямо сейчас я использую myQueue = dispatch_queue_create("com.MyApp.MyQueue", NULL);, но это, похоже, не позволяет установить приоритет?

ответ

34

Создайте последовательную очередь, затем используйте dispatch_set_target_queue(), чтобы установить свою целевую очередь в очередь с высоким приоритетом.

Вот как:

dispatch_set_target_queue(myQueue, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)); 

Теперь myQueue должен работать последовательно с высоким приоритетом. Вот another SO answer, если вы хотите узнать больше.

+0

хорошо, и это все равно означает, что моя очередь сама по себе останется серийной, а затем отправит ее работу в параллельную очередь? –

+0

yup! Должен делать то, что вы хотели. –

+0

спасибо действительно полезно! –

-2

Это требование, что у вас есть пользовательская очередь? Если нет, то вы можете посмотреть на диспетчерские блока к высокому приоритету глобальной очереди, которую вы можете получить с помощью:

dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0) 

иметь в виде, что это глобальная очередь, так это может повлиять на другие параллельные операции.

+5

Требование состоит в том, что мне нужна очередь, чтобы она была последовательной. –

2

dispatch_queue_attr_make_with_qos_class функция может быть новой, так как принятый ответ был отправлен, но что-то вроде:

dispatch_queue_attr_t priorityAttribute = dispatch_queue_attr_make_with_qos_class(
    DISPATCH_QUEUE_SERIAL, QOS_CLASS_USER_INITIATED, -1 
); 

myQueue = dispatch_queue_create("com.MyApp.MyQueue", priorityAttribute); 

может дать очереди высокого приоритета («качество обслуживания»). Существует более высокий класс QOS, но QOS_CLASS_USER_INITIATED эквивалентен DISPATCH_QUEUE_PRIORITY_HIGH.

+1

Это должен быть принятый ответ. Это правильный способ сделать это. – Rob

Смежные вопросы