Выбор ответа Middle GCD и OperationQueue обновлено
Барьер для потокобезопасного кеша
Вопрос
Как сделать кеш с параллельным чтением и эксклюзивной записью на GCD?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Своя concurrent-очередь: чтение sync, запись async(.barrier). Барьерный блок ждёт окончания всех текущих блоков, выполняется один, и только потом очередь продолжает остальные.
Варианты ответа
- Глобальная очередь
.global(): чтение черезsync, запись с барьером - Serial-очередь: запись через
sync, а чтение черезasyncбез ожидания - Чтение и запись через
DispatchQueue.main.async - Своя concurrent-очередь: чтение
sync, записьasync(.barrier)правильный ответ
Разбор
Барьерный блок ждёт окончания всех текущих блоков, выполняется один, и только потом очередь продолжает остальные. Это паттерн reader-writer. Работает только на своей concurrent-очереди: на глобальных очередях флаг барьера игнорируется. Serial-очередь тоже безопасна, но читает строго по одному, а чтение через async не вернёт значение вызывающему. Главная очередь для кеша лишняя нагрузка на UI.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «GCD и OperationQueue»
- DispatchSemaphore для ограничения параллельности
- DispatchWorkItem и отмена
- Как дождаться нескольких запросов в GCD
- Задача на Swift: операции с зависимостями и критический путь
- Задача на Swift: OperationQueue с ограничением параллельности
- DispatchQueue.main.sync на главном потоке
- Инструменты GCD и их задачи
- Синхронный доступ к состоянию без очереди