Sobes.tech
Junior

Čo je GCD (Grand Central Dispatch) a ako sa používa pri vývoji iOS?

sobes.tech AI

Odpoveď od AI

GCD (Grand Central Dispatch) je technológia nízkej úrovne pre paralelizmus od Apple, postavená na C, ale s pohodlnými obalmi v Swift a Objective-C. Poskytuje mechanizmus na správu frontov práce (work items) a ich asynchrónne alebo synchronné vykonávanie na dostupných procesorových jadrách.

Hlavné koncepty GCD:

  1. Dispatch Queues: Fronty na vykonávanie úloh. Existujú dva typy:

    • Serial Queues: Úlohy sa vykonávajú postupne jedna za druhou. Zabráni sa podmienkam súťaže pri prístupe ku spoločným zdrojom.
    • Concurrent Queues: Úlohy sa vykonávajú paralelne (ale poradie ich spustenia a ukončenia nie je garantované). Používajú sa na vykonávanie nezávislých úloh, ktoré môžu bežať súčasne.
    • Main Queue: Špeciálna sekvenčná fronta spojená s hlavným vláknom aplikácie. Používa sa na aktualizáciu UI. Všetky úlohy súvisiace s UI musia byť vykonané práve v tejto fronte.
  2. Work Items (Closures/Blocks): Bloky kódu predstavujúce samostatnú úlohu na vykonanie.

  3. Dispatch Group: Umožňuje skupinovanie úloh a získanie oznámenia, keď sú všetky dokončené.

  4. Dispatch Semaphores: Primitív pre synchronizáciu na riadenie prístupu k obmedzenému počtu zdrojov.

Použitie v vývoji pre iOS:

  • Vykonávanie ťažkých operácií na pozadí: Presun úloh, ako sú sieťové požiadavky, spracovanie obrázkov, práca s databázami, zo hlavnej fronty na pozadie (napríklad globálne konkurenčné fronty), aby sa zabránilo zablokovaniu UI.

    // Asynchrónne vykonanie úlohy v globálnej paralelnej fronte
    DispatchQueue.global(qos: .userInitiated).async {
        // Ťažká operácia
        let result = performHeavyOperation()
    
        // Aktualizácia UI na hlavnom vlákne
        DispatchQueue.main.sync {
            updateUI(with: result)
        }
    }
    
  • Aktualizácia UI: Vždy vykonávať operácie zmeny používateľského rozhrania na main queue.

    // Aktualizácia UI na hlavnom vlákne
    DispatchQueue.main.async {
        self.label.text = "Aktualizované!"
    }
    
  • Serializácia prístupu k dátam: Použitie vlastných sekvenčných frontov na synchronizovaný prístup k spoločným meniteľným zdrojom.

    // Príklad sekvenčnej fronty na synchronizovaný prístup
    let dataAccessQueue = DispatchQueue(label: "com.myapp.dataaccess")
    
    func updateSharedData(newValue: Int) {
        dataAccessQueue.async {
            // Bezpečná zmena spoločných dát
            sharedData = newValue
        }
    }
    
  • Skupinové úlohy: Čakanie na dokončenie viacerých asynchrónnych úloh pred pokračovaním.

    // Skupina úloh
    let group = DispatchGroup()
    
    group.enter() // Začiatok úlohy 1
    performAsyncOperation1 {
        print("Úloha 1 dokončená")
        group.leave()
    }
    
    group.enter() // Začiatok úlohy 2
    performAsyncOperation2 {
        print("Úloha 2 dokončená")
        group.leave()
    }
    
    // Oznámenie po dokončení všetkých úloh v skupine
    group.notify(queue: .main) {
        print("Všetky úlohy dokončené, aktualizujeme UI")
        // Aktualizácia UI
    }
    
  • Odsunuté vykonanie: Vykonanie kódu po stanovenom časovom intervale.

    // Odsunuté vykonanie po 2 sekundách
    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        print("Spustené po 2 sekundách")
    }
    

GCD poskytuje vyššiu úroveň a efektívnejší prístup k riadeniu vlákien v porovnaní s tradičnými vláknami (napríklad Thread), delegujúc správu vlákien na systém a umožňujúc efektívne využívanie viacjadrových procesorov.