Junior
Ce este GCD (Grand Central Dispatch) în contextul dezvoltării iOS?
sobes.tech AI
Răspuns de la AI
GCD (Grand Central Dispatch) este o API de nivel scăzut de la Apple pentru gestionarea operațiunilor paralele și executarea asincronă a codului în aplicații. Oferă un mecanism pentru trimiterea sarcinilor în cozi de execuție, gestionate de sistem.
Caracteristici cheie:
- Cozi de sarcini (Dispatch Queues): structuri FIFO în care sunt adăugate blocuri de cod (closures) pentru execuție.
- Derivă din tipuri concurrente (paralel) și seriale (secvențiale).
- Oferă cozi globale de sistem și permit crearea de cozi personalizate.
- Blocuri (Blocks): unități de lucru trimise în cozi.
- Gestionarea firelor de execuție: abstractizează dezvoltatorul de gestionarea directă a firelor, permițând sistemului să distribuie sarcinile în mod optim între nucleele procesorului disponibile.
- Priorități: permit specificarea unei priorități pentru sarcini în cozi globale concurrente.
Tipuri de cozi:
- Seriale (secuențiale): execută sarcinile strict una câte una, în ordinea adăugării. Garantat că doar o sarcină din această coadă se execută în orice moment.
- Coada principală (
DispatchQueue.main) este o coadă serială specială pentru actualizări UI. - Cozi seriale personalizate.
- Coada principală (
- Concurrente: pot executa mai multe sarcini simultan (în paralel), fără a garanta ordinea finalizării.
- Cozi globale concurrente cu diferite niveluri de calitate a serviciului (QoS).
- Cozi concurrente personalizate.
Niveluri de calitate a serviciului (QoS) pentru cozi globale concurrente:
| Nivel QoS | Descriere | Exemple de utilizare |
|---|---|---|
userInteractive |
Sarcini cu care interacționează activ utilizatorul. | Animații, procesarea evenimentelor UI. |
userInitiated |
Sarcini inițiate de utilizator, care necesită rezultat imediat. | Încărcarea conținutului la apăsarea unui buton. |
utility |
Sarcini care durează mult și nu necesită rezultat imediat. | Încărcarea datelor, procesarea imaginilor în fundal. |
background |
Sarcini în fundal, invizibile pentru utilizator. | Actualizarea cache-ului, sincronizarea datelor. |
unspecified |
Nivelul QoS nu este specificat, sistemul îl determină singur. | API-uri vechi sau sarcini de nivel scăzut ale sistemului. |
Exemplu simplu de utilizare:
// Executați o sarcină în fundal (coadă concurentă globală)
DispatchQueue.global(qos: .userInitiated).async {
// Executați o operație de durată lungă
print("Executare sarcină în fundal")
// Revenirea pe thread-ul principal pentru actualizarea UI
DispatchQueue.main.async {
print("Actualizare UI pe thread-ul principal")
}
}
GCD simplifică lucrul cu multitreading-ul și paralelismul, făcând codul mai ușor de citit și mai puțin predispus la erori de race conditions comparativ cu gestionarea de fire de nivel scăzut (Thread).