Sobes.tech
Middle

Ce instrumente sunt disponibile în Grand Central Dispatch (GCD)?

sobes.tech AI

Răspuns de la AI

Instrumente principale GCD:

  • Cozi de dispatch (Dispatch Queues): Controlează executarea blocurilor de cod. Pot fi:
    • Secvențiale (Serial): Execută sarcinile una câte una, garantând ordinea.
    • Paralele (Concurrent): Execută sarcinile simultan (în limitele resurselor sistemului disponibile).
  • Cozi globale paralele (Global Concurrent Queues): Sunt furnizate de sistem, au priorități predefinite (clase de calitate a serviciului - QoS).
  • Coada principală (Main Queue): O coadă specială secvențială, legată de firul principal al aplicației. Este folosită pentru lucrul cu UI.
  • Grupuri de dispatch (Dispatch Groups): Permite urmărirea finalizării unui set de sarcini asincrone.
  • Semantica barierelor (Barrier Semantics): Pentru cozi paralele, permite crearea unei "barriere", după care sunt executate doar sarcinile plasate după barieră, până când aceasta este depășită.
  • Sursă de dispatch (Dispatch Sources): Permite reacția la evenimentele sistemului (operații de fișiere, semnale, temporizatoare etc.).
  • DispatchWorkItem: Învelește un bloc de cod și poate fi trimis în coadă, anulat și notificat la finalizare.

Exemplu de creare a unei cozi secvențiale și executarea unei sarcini:

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

serialQueue.async {
    // Se execută asincron în coada secvențială
    print("Sarcină executată în coada secvențială")
}

Exemplu de utilizare a unui grup de dispatch:

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

group.enter() // Intrăm în grup
concurrentQueue.async {
    // Sarcina 1
    print("Sarcina 1 finalizată")
    group.leave() // Ieșim din grup
}

group.enter() // Intrăm în grup
concurrentQueue.async {
    // Sarcina 2
    print("Sarcina 2 finalizată")
    group.leave() // Ieșim din grup
}

group.notify(queue: .main) {
    // Se execută după finalizarea tuturor sarcinilor din grup
    print("Toate sarcinile din grup au fost finalizate")
}

Exemplu de utilizare a DispatchWorkItem:

let workItem = DispatchWorkItem {
    print("WorkItem executat")
}

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

// workItem.cancel() // Poate fi anulat înainte de execuție