Ответ
Потокобезопасность — свойство кода корректно работать в многопоточной среде, предотвращая состояния гонки (race conditions) и повреждение данных.
Основные механизмы в iOS:
-
Serial DispatchQueue — последовательная очередь гарантирует выполнение одной задачи за раз:
let serialQueue = DispatchQueue(label: "com.example.serial") serialQueue.async { // Безопасный доступ к общему ресурсу } -
Синхронизация через примитивы:
NSLock,os_unfair_lock(более эффективный)DispatchSemaphoreдля контроля доступа к ограниченному числу ресурсов
-
Атомарные свойства через property wrapper:
@propertyWrapper struct Atomic<Value> { private var value: Value private let lock = NSLock() var wrappedValue: Value { get { lock.withLock { value } } set { lock.withLock { value = newValue } } } } -
Actor (Swift 5.5+) — автоматическая синхронизация доступа:
actor Counter { private var value = 0 func increment() { value += 1 } func getValue() -> Int { value } }
// Использование: let counter = Counter() Task { await counter.increment() let current = await counter.getValue() }
**Best practices:**
- Избегайте общего изменяемого состояния между потоками
- Для UI-обновлений всегда используйте `DispatchQueue.main`
- Предпочитайте value types (структуры) reference types (классы) где возможно
- Используйте `@MainActor` для изоляции UI-кода