← Назад к вопросам

Что такое iOS GCD?

1.0 Junior🔥 142 комментариев
#Нативная интеграция

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

iOS GCD (Grand Central Dispatch)

GCD — это система управления потоками и асинхронным выполнением кода на iOS. Это низкоуровневый API из libdispatch, который позволяет разработчикам безопасно работать с многопоточностью без явного создания потоков.

Основная идея

Вместо создания потоков вручную, ты отправляешь задачи в dispatch queues — очереди, которые управляют потоками автоматически. GCD сам решает, сколько потоков нужно создать.

Типы очередей

Main Queue

Выполняет задачи в главном потоке (UI thread):

DispatchQueue.main.async {
  // Обновление UI
  self.label.text = "Updated"
}

Global Queues

Фоновые очереди с разными приоритетами:

let quality: DispatchQoS.QoSClass = .userInitiated
DispatchQueue.global(qos: quality).async {
  // Выполняется в фоне
  let result = heavyComputation()
  DispatchQueue.main.async {
    updateUI(result)
  }
}

Custom Serial Queue

Выполняет задачи одну за другой:

let serialQueue = DispatchQueue(label: "com.app.serial")
serialQueue.async { print("1") }
serialQueue.async { print("2") } // Выполнится после первой

Custom Concurrent Queue

Выполняет несколько задач одновременно:

let concurrentQueue = DispatchQueue(label: "com.app.concurrent", attributes: .concurrent)
concurrentQueue.async { print("1") }
concurrentQueue.async { print("2") } // Может выполниться одновременно

Практические примеры

Загрузка данных с сети

DispatchQueue.global(qos: .userInitiated).async {
  let data = URLSession.shared.data(from: url)
  DispatchQueue.main.async {
    self.updateUI(with: data)
  }
}

Синхронизация доступа к ресурсам

let queue = DispatchQueue(label: "com.app.database")
queue.async {
  database.write(data) // Безопасно: выполнится в одном потоке
}

Таймер

let queue = DispatchQueue.main
let timer = DispatchSourceTimer(queue: queue)
timer.setEventHandler {
  print("Tick")
}
timer.schedule(wallDeadline: .now(), repeating: 1.0)
timer.resume()

QoS (Quality of Service)

  • userInteractive — UI обновления, ответ на касание (высший приоритет)
  • userInitiated — действия пользователя, требующие быстрого ответа
  • utility — длительные операции (загрузка, синхронизация)
  • background — неприоритетные задачи (индексирование)

GCD в контексте Flutter

При написании нативного iOS кода для Platform Channel часто используешь GCD:

func invokeMethod(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
  if call.method == "heavyTask" {
    DispatchQueue.global(qos: .userInitiated).async {
      let result = self.doHeavyWork()
      DispatchQueue.main.async {
        result(result) // Отправляем результат в Dart
      }
    }
  }
}

Почему это важно для Flutter-разработчика

  • Когда пишешь нативный код на Swift для Platform Channel, нужно понимать, как управлять потоками
  • GCD помогает не блокировать main thread при выполнении длительных операций
  • Неправильное использование приведёт к зависаниям UI

GCD — это мощный инструмент для асинхронного программирования на iOS, альтернатива async/await (добавлена позже).

Что такое iOS GCD? | PrepBro