Словарь-кеш пишется из нескольких очередей: чем чинить гонку
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 актором либо работать со словарём на одной приватной очереди
