Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
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 (добавлена позже).