Middle
Какво е dispatch група в контекста на iOS разработката?
sobes.tech AI
Отговор от AI
DispatchGroup — това е механизъм на GCD (Grand Central Dispatch), който позволява да следите завършването на група асинхронни задачи и да изпълните действие след тяхното завършване. Полезен е, когато е необходимо да координирате работата на няколко dispatch опашки или нишки.
Основни методи:
enter(): Информира групата, че задача е започнала. Увеличава вътрешния брояч на групата.leave(): Информира групата, че задача е приключила. Намалява брояча.wait(): Блокира текущия поток, докато броячът на групата не стане нула или не изтече тайм-аутът.notify(queue:execute:): Регистрира блок код, който ще бъде изпълнен асинхронно на указаната опашка, когато броячът на групата стане нула.
Пример за използване на notify:
import Foundation
let group = DispatchGroup()
let queue = DispatchQueue.global(qos: .userInitiated)
queue.async(group: group) {
// Първа асинхронна задача
print("Задача 1 изпълнява се...")
Thread.sleep(forTimeInterval: 1)
print("Задача 1 завърши.")
}
queue.async(group: group) {
// Втора асинхронна задача
print("Задача 2 изпълнява се...")
Thread.sleep(forTimeInterval: 2)
print("Задача 2 завърши.")
}
// Този блок ще се изпълни след като всички задачи в групата приключат
group.notify(queue: .main) {
print("Всички задачи в групата са приключили.")
}
// За демонстрация на немонолитната природа на notify
print("Код след добавяне на задачи")
Пример с ръчно enter() и leave():
import Foundation
let group = DispatchGroup()
let queue = DispatchQueue.global(qos: .userInitiated)
group.enter() // Задача 1 започна
queue.async {
print("Задача 1 изпълнява се...")
Thread.sleep(forTimeInterval: 1)
print("Задача 1 завърши.")
group.leave() // Задача 1 приключи
}
group.enter() // Задача 2 започна
queue.async {
print("Задача 2 изпълнява се...")
Thread.sleep(forTimeInterval: 2)
print("Задача 2 завърши.")
group.leave() // Задача 2 приключи
}
group.notify(queue: .main) {
print("Всички задачи в групата са приключили с notify.")
}
// Пример за използване на wait (блокиращ)
// group.wait()
// print("Всички задачи са приключили с wait.") // Този код ще се изпълни след като всички задачи приключат, блокирайки текущия поток.