Что такое параметр qos в DispatchQueue и в чем разница между его значениями
Что проверяют
Понимаете ли вы, что QoS это не число приоритета, а заявление системе о характере работы, и умеете ли выбирать уровень осознанно. Заодно проверяют знание инверсии приоритетов, ради которой механизм и устроен именно так.
Как отвечать
QoS это классификация работы, по которой система решает, сколько дать процессорного времени, какой приоритет назначить операциям ввода и вывода, на каких ядрах исполнять и насколько экономить энергию. Это подсказка планировщику, а не гарантия.
Уровни от высокого к низкому. userInteractive: работа, от которой зависит следующий кадр на экране, практически это главный поток, свои очереди с таким уровнем заводят редко. userInitiated: пользователь нажал и ждёт результата прямо сейчас, счёт идёт на доли секунды. default: уровень по умолчанию, когда работа не инициирована пользователем явно и не является обслуживающей. utility: длительная задача с видимым прогрессом, секунды и минуты, система вправе увести её на энергоэффективные ядра. background: обслуживание, которого никто не ждёт, индексация и синхронизация.
Сильный ответ добавляет два факта: QoS распространяется вместе с задачей по цепочке вызовов, а синхронное обращение к очереди с низким уровнем временно поднимает её приоритет, чтобы вызывающий не ждал. В Swift Concurrency ту же роль играет приоритет задачи.
Где спотыкаются
Ставят userInteractive всему подряд. Система теряет возможность расставить работу по важности, выигрыша не появляется, а расход батареи растёт.
Кладут в background то, чего пользователь ждёт, и потом разбирают жалобу про вечную загрузку на устройстве. Такие задачи откладываются надолго, особенно в режиме энергосбережения.
Ждут от уровня гарантий порядка выполнения. QoS влияет на планирование, но не упорядочивает задачи между очередями; за порядок отвечает последовательная очередь или барьер.