Sobes.tech
Middle

Ce este Grand Central Dispatch și cum este utilizat în dezvoltarea iOS?

sobes.tech AI

Răspuns de la AI

Grand Central Dispatch (GCD) — o API de nivel inferior pentru gestionarea multitasking-ului, care oferă un pool de fire de sistem și planifică executarea sarcinilor pe acestea.

Conceptele principale ale GCD:

  • Cozi de dispatch: Cozi în care sunt plasate blocuri de cod (sarcini) pentru executare.
    • Cozi seriale: Execută blocurile în ordinea adăugării, câte unul.
    • Cozi concurente: Execută blocurile în paralel, dar în ordinea adăugării.
  • Sarcini (Blocuri): Unități de lucru trimise către cozi de dispatch.
  • Sursă de dispatch: Monitorizarea evenimentelor sistemului (fișiere, socket-uri, semnale), care invocă executarea blocurilor la apariția lor.

Utilizat pentru:

  1. Executarea operațiunilor în fundal: Încărcarea datelor din rețea, procesarea imaginilor, calcule complexe, pentru a nu bloca firul principal (UI).

    DispatchQueue.global(qos: .userInitiated).async {
        // Executarea unei operațiuni intensive în resurse
        let processedData = performHeavyProcessing()
    
        DispatchQueue.main.async {
            // Actualizarea UI pe firul principal
            updateUI(with: processedData)
        }
    }
    
  2. Planificarea sarcinilor: Executare întârziată sau periodică.

    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        // Acest cod va fi executat în 2 secunde
        print("Executare întârziată")
    }
    
  3. Sincronizarea accesului la date: Utilizarea cozii seriale sau DispatchQueue.concurrentPerform pentru controlul accesului paralel.

    let syncQueue = DispatchQueue(label: "com.myapp.syncdatasource", attributes: .concurrent)
    var sharedArray = [Int]()
    
    func addItem(_ item: Int) {
        syncQueue.async(flags: .barrier) { // Utilizarea .barrier pentru acces exclusiv la scriere
            sharedArray.append(item)
        }
    }
    
    func processItems() {
        syncQueue.sync { // Citire sincronă
            for item in sharedArray {
                print(item)
            }
        }
    }
    

Avantaje față de gestionarea manuală a firelor (POSIX threads):

  • Ușurință în utilizare: Nivel mai înalt de abstractizare.
  • Eficiență: GCD gestionează mai eficient pool-ul de fire ale sistemului, reducând costurile.
  • Scalabilitate: Se adaptează automat la numărul de nuclee ale procesorului.

Tipuri de QoS (Calitatea serviciului): Determină prioritatea sarcinii pentru planificatorul GCD.

QoS Aplicație
userInteractive Actualizări UI, animații, răspuns rapid
userInitiated Sarcini inițiate de utilizator, care necesită finalizare rapidă (încărcare, procesare foto)
default Prioritate implicită, între userInitiated și utility
utility Sarcini de durată lungă fără urgență (încărcare, indexare)
background Sarcini invizibile utilizatorului (backup, sincronizare în fundal)
unspecified Prioritate nespecificată, determinată de sistem