> Как реализовать потокобезопасный словарь (iOS, Swift)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: Московская биржа

Стек: iOS, Swift

> Пример ответа

В Swift для iOS потокобезопасный словарь можно реализовать несколькими способами. Самый простой и эффективный - использовать DispatchQueue с барьерными операциями (barrier flags) для записи и синхронное чтение. Пример:

SWIFT
class 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 и барьерами оптимален по скорости и простоте.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью