Sobes.tech
Middle

Koji alati su dostupni u Grand Central Dispatch (GCD)?

sobes.tech АИ

Одговор од АИ

Glavni alati GCD:

  • Redovi za dispatch (Dispatch Queues): Upravljaju izvršavanjem blokova koda. Mogu biti:
    • Sekvencijalni (Serial): Izvršavaju zadatke jedan po jedan, garantujući redosled.
    • Paralelni (Concurrent): Izvršavaju zadatke istovremeno (u okviru dostupnih sistemskih resursa).
  • Globalni paralelni redovi (Global Concurrent Queues): Obezbeđeni od strane sistema, imaju unapred definisane prioritete (klase kvaliteta usluge - QoS).
  • Glavni red (Main Queue): Poseban sekvencijalni red povezan sa glavnim thread-om aplikacije. Koristi se za rad sa UI.
  • Grupe za dispatch (Dispatch Groups): Omogućavaju praćenje završetka skupa asinhronih zadataka.
  • Semantika barijere (Barrier Semantics): Za paralelne redove, omogućava kreiranje "barijere", nakon koje se izvršavaju samo zadaci postavljeni nakon barijere, dok se ona ne prevaziđe.
  • Izvori za dispatch (Dispatch Sources): Omogućavaju reagovanje na sistemske događaje (operacije fajlova, signali, tajmeri itd.).
  • DispatchWorkItem: Omotava blok koda i može biti poslat u red, otkazan i obavešten o završetku.

Primer kreiranja sekvencijalnog reda i izvršavanja zadatka:

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

serialQueue.async {
    // Izvršava se asinhrono u sekvencijalnom redu
    print("Zadatak izvršen u sekvencijalnom redu")
}

Primer korišćenja dispatch grupe:

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

group.enter() // Ulazak u grupu
concurrentQueue.async {
    // Zadatak 1
    print("Zadatak 1 završen")
    group.leave() // Izlazak iz grupe
}

group.enter() // Ulazak u grupu
concurrentQueue.async {
    // Zadatak 2
    print("Zadatak 2 završen")
    group.leave() // Izlazak iz grupe
}

group.notify(queue: .main) {
    // Izvršava se nakon završetka svih zadataka u grupi
    print("Svi zadaci u grupi su završeni")
}

Primer korišćenja DispatchWorkItem:

let workItem = DispatchWorkItem {
    print("WorkItem izvršen")
}

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

// workItem.cancel() // Može biti otkazan pre izvršenja