Sobes.tech
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.") // Този код ще се изпълни след като всички задачи приключат, блокирайки текущия поток.