TGViewer
Мобильный трудоголик Мобильный трудоголик @hardworkerit · 1.64K subscribers
Post #246 1.38K
🔢 Синглтоны в Swift Concurrency: как избежать гонки данных.

Синглтоны - это классический паттерн, который есть почти в каждом iOS-проекте. Но в эпоху Swift Concurrency они превращаются в мину замедленного действия, потому что это глобальное состояние, доступное из любого потока.

Обычный синглтон - это класс, а классы в Swift по умолчанию не thread-safe (не потокобезопасны). Когда вы обращаетесь к синглтону из разных потоков или акторов, возможны гонки данных и непредсказуемое поведение.


Решение проблемы:

Есть несколько стратегий:

🔹 @MainActor


@MainActor
class ThemeManager {
static let shared = ThemeManager()
private init() {}

var currentTheme = "light"

func switchToDarkTheme() {
currentTheme = "dark"
// Здесь обновляем UI
}
}


Как это работает:

🔵Гарантирует, что все обращения к синглтону будут на главном потоке.
🔵Компилятор сам проверяет изоляцию.
🔵Отлично подходит для синглтонов, которые влияют на интерфейс.


🔹 @unchecked Sendable


class CounterManager: @unchecked Sendable {
static let shared = NetworkManager()
private init() {}

// Используем NSLock для потокобезопасности
private let lock = NSLock()
private var count = 0

func increment() {
lock.lock()
count += 1
print("Count: \(count)")
lock.unlock()
}
}

// Использование:
CounterManager.shared.increment()


Это вариант для случаев, когда вы вручную обеспечиваете потокобезопасность через NSLock или подобные инструменты.


🔗 Ссылка на подробную статью


💡 Вывод:

Для большинства проектов @MainActor оказывается идеальным решением. Этот подход сочетает в себе простоту использования и надежную защиту от проблем с потоками.

Другие варианты вроде кастомных акторов или ручных блокировок часто создают больше сложностей, чем решают проблем. Они требуют постоянного использования await или тщательной ручной синхронизации, что лишает синглтоны их главного преимущества - простоты.


➡️ Подписаться на канал
Мобильный трудоголик
  • 🔥 11
  • 👍 7
  • ❤ 2
  • 🙏 1
More from @hardworkerit
  1. Oct 6, 2026🔢 Swift 6.4: новая диагностика ретейн циклов. В Swift 6.4 появилась новая диагностика, ко…
  2. Oct 4, 2026🔢 SwiftUI: определение угла раскрытия iPhone Duo. В iOS 27.1 появился модификатор .onHing…
  3. Oct 2, 2026👣 Архитекторы, тестировщики и кодеры. Создаем мультиагентную команду Разработка с ИИ-аген…
  4. Oct 1, 2026🔢 Работа с Picture-in-Picture в iOS. Picture-in-Picture - системная функция iOS, которая…
  5. Sep 29, 2026🔢 Управление тулбарами на iPhone Duo. На iPhone Duo элементы управления навигацией, дейст…
  6. Sep 27, 2026🔢 Новые возможности Hashable в Swift 6.4 В Swift 6.4 добавили Hashable для нескольких тип…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →