Какой приоритет следует задавать задаче авторизации пользователя
Что проверяют
Знаете ли вы классы QoS в GCD и Swift Concurrency и умеете ли выбирать их по смыслу: кто ждёт результат и насколько срочно. Следом обычно спрашивают про приоритет фонового обновления токена и про инверсию приоритетов.
Как отвечать
Приоритет выбирают по тому, ждёт ли пользователь. Авторизация запускается нажатием «Войти», и дальше человек смотрит на индикатор и ничего другого сделать не может. Это ровно определение .userInitiated: работу начал пользователь, она его блокирует, но не обязана уложиться в кадр.
Шкала QoS от высшего к низшему:
.userInteractive: то, что нужно для текущего кадра, анимации, отклик на жест. Для сетевого запроса завышено;.userInitiated: пользователь нажал и ждёт, как раз вход;.default: когда QoS не указан;.utility: долгая работа, фоновое обновление токена, предзагрузка;.background: то, чего пользователь не видит: синхронизация, чистка кеша.
В Swift Concurrency это Task(priority: .userInitiated), где .high синоним .userInitiated, а .low синоним .utility. Сам URLSession асинхронный, поэтому QoS влияет на обработку ответа, парсинг и запись токена в Keychain; у URLSessionTask есть ещё свой priority.
Дальше покажите, что приоритет не статичен. Тихое обновление токена идёт на .utility, но если пользователь открыл экран и его запрос ждёт свежий токен, работа должна подняться. GCD повышает приоритет последовательной очереди, когда на неё ставят более срочную задачу или ждут её через sync. Семафор так не умеет: главный поток, ждущий на DispatchSemaphore фоновую задачу, получает инверсию приоритетов, и Thread Performance Checker в Xcode о ней предупреждает.
Где спотыкаются
Ставят .userInteractive, потому что «вход же важный». Этот класс для работы в пределах кадра, а завышение отнимает ресурсы у интерфейса.
Уходят в продуктовые рассуждения про безопасность и UX, хотя вопрос про планирование потоков. Если сомневаетесь, что имел в виду интервьюер, уточните.
Делают запрос синхронным на главном потоке или ждут его семафором. Интерфейс подвисает, а если это случилось при запуске, система может завершить приложение по watchdog.