Sobes.tech
Middle

Какви инструменти са налични в Grand Central Dispatch (GCD)?

sobes.tech AI

Отговор от AI

Основни инструменти на GCD:

  • Dispatch опашки (Dispatch Queues): Управляват изпълнението на блокове код. Могат да бъдат:
    • Последователни (Serial): Изпълняват задачите една след друга, гарантирайки реда.
    • Паралелни (Concurrent): Изпълняват задачите едновременно (в рамките на наличните системни ресурси).
  • Глобални паралелни опашки (Global Concurrent Queues): Предоставени от системата, имат предварително зададени приоритети (класи на качество на услугата - QoS).
  • Основна опашка (Main Queue): Специална последователна опашка, свързана с главния поток на приложението. Използва се за работа с UI.
  • Групи за dispatch (Dispatch Groups): Позволяват да следите завършването на набор от асинхронни задачи.
  • Бариера (Barrier Semantics): За паралелните опашки, позволява създаването на "бариера", след която се изпълняват само задачите, поставени след бариерата, докато тя не бъде преодоляна.
  • Източници на dispatch (Dispatch Sources): Позволяват реагиране на системни събития (файлови операции, сигнали, таймери и др.).
  • DispatchWorkItem: Обгръща блок код и може да бъде изпратен към опашка, отменен и уведомен при завършване.

Пример за създаване на последователна опашка и изпълнение на задача:

let serialQueue = DispatchQueue(label: "com.example.serialQueue")

serialQueue.async {
    // Изпълнява се асинхронно в последователната опашка
    print("Задача изпълнена в последователната опашка")
}

Пример за използване на dispatch група:

let group = DispatchGroup()
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

group.enter() // Влизане в групата
concurrentQueue.async {
    // Задача 1
    print("Задача 1 завършена")
    group.leave() // Излизане от групата
}

group.enter() // Влизане в групата
concurrentQueue.async {
    // Задача 2
    print("Задача 2 завършена")
    group.leave() // Излизане от групата
}

group.notify(queue: .main) {
    // Изпълнява се след завършване на всички задачи в групата
    print("Всички задачи в групата са завършени")
}

Пример за използване на DispatchWorkItem:

let workItem = DispatchWorkItem {
    print("WorkItem изпълнен")
}

DispatchQueue.global().async(execute: workItem)

// workItem.cancel() // Може да бъде отменен преди изпълнение