Установить приоритет для созданной пользователем последовательной асинхронной очереди

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

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

Насколько я понимаю, это заставит все задачи в последовательной очереди выполняться одновременно. Правильно ли я понимаю? Если да, то какое альтернативное решение?


person Pranav Jaiswal    schedule 03.10.2014    source источник
comment
Какого черта кто-то проголосовал бы за это без комментариев? Я насчитал три голоса за ответы (по состоянию на 13 мая 2015 г.), это означает, что вопрос помог как минимум трем людям найти что-то ценное. Люди иногда кажутся злыми на этом сайте.   -  person Le Mot Juiced    schedule 13.05.2015


Ответы (2)


Ваша очередь по-прежнему будет последовательной. Он просто будет выполнять свои задачи, по одной, в одном слоте глобальной параллельной фоновой очереди с высоким приоритетом. Однажды созданная последовательная очередь никоим образом не может быть "сделана параллельной".

Точно так же, если вы создаете параллельную очередь и устанавливаете ее для последовательной очереди, она фактически становится последовательной.

Все это описано в этой справочной странице< /а>.

person ipmcc    schedule 03.10.2014
comment
Можете ли вы добавить ссылку на документацию Apple, в которой говорится об этом ... Потому что я ничего не нашел. Также есть способ установить приоритет очереди только СЛЕДУЮЩИЙ для main_queue(). - person Pranav Jaiswal; 03.10.2014
comment
Ссылка добавлена. Что вы имеете в виду под тем, есть ли способ установить приоритет очереди только СЛЕДУЮЩИЙ для main_queue ()? Если вы имеете в виду, есть ли способ установить приоритет очереди, чтобы основной поток всегда имел наивысший приоритет? я считаю, без доказательств, что вы не можете сделать это явно, но на практике любой целевой приоритет ниже, чем DISPATCH_QUEUE_PRIORITY_HIGH, будет эффективно удовлетворять этому требованию. - person ipmcc; 03.10.2014
comment
Я знаю, что самая приоритетная очередь TOP — это mainQueue(). Пользовательская очередь, которую я создал, будет иметь следующий наивысший приоритет. Это звучит ясно? - person Pranav Jaiswal; 03.10.2014
comment
Ну, если честно, у вас нет никакого контроля над приоритетом основной очереди. Если вы считаете, что основная очередь всегда имеет наивысший приоритет, то способ сделать очередь имеющей следующий наивысший приоритет — нацелить ее на глобальную параллельную очередь с помощью DISPATCH_QUEUE_PRIORITY_HIGH. - person ipmcc; 03.10.2014

До iOS 8, устанавливая целевую очередь в очередь с высоким приоритетом, вы могли бы добиться этого. Ваша очередь останется последовательной, даже если целевая очередь является параллельной.

Начиная с версии 8.0 есть еще один способ сделать это:

dispatch_queue_attr_t queueAttrs = dispatch_queue_attr_make_with_qos_class(
    DISPATCH_QUEUE_SERIAL,
    QOS_CLASS_USER_INITIATED /* Same as DISPATCH_QUEUE_PRIORITY_HIGH */, 
    0
);

dispatch_queue_t queue = dispatch_queue_create("myqueue",queueAttrs);
person aLevelOfIndirection    schedule 07.10.2014
comment
В документации для параметра relative_priority указано: Отрицательное смещение от максимального поддерживаемого приоритета планировщика для данного класса качества обслуживания. Это значение должно быть меньше 0 и больше MIN_QOS_CLASS_PRIORITY. Но вы проходите 0 здесь. - person Zev Eisenberg; 24.06.2015