> Как реализовать потокобезопасный словарь (iOS, Swift)
Уровень: senior · Роль: mobile · Категория: Технические вопросы
Компании: Московская биржа
Стек: iOS, Swift
> Пример ответа
В Swift для iOS потокобезопасный словарь можно реализовать несколькими способами. Самый простой и эффективный - использовать DispatchQueue с барьерными операциями (barrier flags) для записи и синхронное чтение. Пример:
SWIFTclass ThreadSafeDictionary<Key: Hashable, Value> {private var dictionary: [Key: Value] = [:]private let queue = DispatchQueue(label: "com.example.threadSafeDict", attributes: .concurrent)func get(_ key: Key) -> Value? {queue.sync {return dictionary[key]}}func set(_ key: Key, value: Value) {queue.async(flags: .barrier) {self.dictionary[key] = value}}func removeValue(forKey key: Key) {queue.async(flags: .barrier) {self.dictionary.removeValue(forKey: key)}}}
Объяснение:
- Чтение выполняется синхронно через
queue.sync, что позволяет параллельно читать данные из нескольких потоков. - Запись и удаление выполняются асинхронно с флагом
.barrier, что гарантирует эксклюзивный доступ к словарю во время модификации, блокируя все остальные операции до завершения.
Альтернативы:
- Использование
NSLockилиos_unfair_lock- проще, но менее производительно при частых чтениях. - Swift 5.5+ с акторами (
actor) - встроенная потокобезопасность, но требует iOS 13+ и async/await.
Для большинства iOS-приложений подход с concurrent queue и барьерами оптимален по скорости и простоте.
> Похожие задачи по mobile
Что такое capture list в closure и как с ним работать
Что должна возвращать функция сравнения
Все ли нормально с рекурсивно ссылающейся на себя структурой
По какому времени работает функция reduce у массива
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью