Как флаг .enforceQoS увеличивает приоритет? - PullRequest
1 голос
/ 01 ноября 2019

Я попытался увеличить приоритет блока, выполняемого в параллельной очереди. Я предположил, что для этой цели подходит флаг forceQoS . Как сказали в Apple Docs:

Этот флаг отдает приоритет качеству обслуживания класса над классом, связанным с текущим контекстом выполнения, при условии, что это не снижает качество обслуживания.

Предположим, есть очередь:

/// Lowest priority queue
let concurrentQueue = DispatchQueue(label: "queue.conc.test", qos: .background, attributes: .concurrent)

У нас также есть несколько DispatchWorkItem задач, некоторые из которых:

let item1 = DispatchWorkItem(qos: .userInitiated) { /* execute block */ }
let item2 = DispatchWorkItem(qos: .utility, flags: .enforceQoS) { /* execute block */ }

Myвопрос прост: гарантирует ли Apple, что item2 будет выполняться раньше?

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

Большое спасибо.

1 Ответ

1 голос
/ 02 ноября 2019

«Расставлять приоритеты» здесь не означает «бежать раньше». Это означает, что «при принятии решения о том, какое QoS назначить для этого блока, предпочтите тот, который здесь указан, а не тот, который предлагает текущий контекст выполнения (если тот, что здесь указан выше, чем тот, который в противном случае получил бы этот блок)».

Если вам требуется, чтобы item2 выполнялся перед item1, используйте notify для их заказа:

item2.notify(queue: concurrentQueue, execute: item1)

Ни в коем случае не пытайтесь использовать QoS для заказа рабочих элементов. QoS - сложная система, которая включает в себя больше, чем просто приоритет;это также включает в себя такие вещи, как, находится ли устройство в режиме энергосбережения. Назначьте элементам QoS, соответствующее их намерениям, на основе описаний каждого уровня обслуживания. Если вам требуется, чтобы все выполнялось в определенном порядке, используйте зависимости (например, notify), чтобы упорядочить их.

...