Вопрос проверяет знакомство с основными компонентами фреймворка GCD для управления многопоточностью в iOS.
GCD — это низкоуровневый API для управления параллельными операциями. DispatchQueue — очередь для выполнения задач (главная main и фоновые). DispatchGroup — для отслеживания завершения группы задач. DispatchSemaphore — для контроля доступа к ограниченному ресурсу из нескольких потоков. DispatchBarrier — для создания точки синхронизации в concurrent очереди, обеспечивая эксклюзивный доступ к ресурсу.
GCD упрощает работу с потоками, позволяя описывать задачи, которые нужно выполнить, а система сама управляет потоками.
Основные инструменты:
DispatchQueue: Очередь, которая выполняет задачи последовательно (serial) или параллельно (concurrent).
main queue: Главная очередь для обновления UI. Все операции с интерфейсом должны выполняться на ней.
global queues: Фоновые очереди с разными приоритетами (например, .background, .utility).
// Выполнение задачи в фоне
DispatchQueue.global(qos: .background).async {
// Долгая задача (сетевой запрос)
// Возврат на главный поток для обновления UI
DispatchQueue.main.async {
self.label.text = "Задача завершена"
}
}DispatchGroup: Позволяет сгруппировать несколько асинхронных задач и получить уведомление, когда все они завершатся.
let group = DispatchGroup()
// Запуск нескольких асинхронных задач
for url in urls {
group.enter() // Сообщаем группе о начале задачи
downloadImage(from: url) {
group.leave() // Сообщаем группе о завершении задачи
}
}
// Ожидаем завершения всех задач и затем выполняем действие
group.notify(queue: .main) {
print("Все изображения загружены")
}DispatchSemaphore: Механизм для ограничения количества потоков, которые одновременно могут получить доступ к ресурсу. signal() увеличивает счетчик, wait() — уменьшает. Если счетчик равен нулю, поток блокируется.
DispatchBarrier: Используется в concurrent очередях для создания "барьерной" задачи. Пока выполняется барьерная задача, другие задачи в этой очереди не выполняются. Полезно для чтения/записи, когда запись должна быть атомарной.