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