Вступить в клуб →
сложнаявопросСеть, данные и конкурентность

Словарь-кеш пишется из нескольких очередей: чем чинить гонку

final class ImageLoader {
    private var cache: [URL: UIImage] = [:]

    func store(_ image: UIImage, for url: URL) {
        cache[url] = image
    }

    func image(for url: URL) -> UIImage? {
        cache[url]
    }
}

Методы вызываются одновременно из нескольких фоновых очередей при загрузке картинок в ленте. В Crashlytics есть редкие падения EXC_BAD_ACCESS внутри операций со словарём.

Какое изменение действительно устраняет гонку?

  • Объявить cache как lazy var: ленивое свойство инициализируется атомарно, конкурентный доступ станет безопасным
  • Скопировать словарь в локальную переменную перед записью: copy-on-write разведёт конкурентные обращения
  • Пометить cache как @Published — доставка изменений через главный поток сериализует доступ
  • Изолировать доступ: сделать ImageLoader актором либо работать со словарём на одной приватной очереди

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела