Sobes.tech
Junior

Co je GCD (Grand Central Dispatch) a jak se používá při vývoji iOS?

sobes.tech AI

Odpověď od AI

GCD (Grand Central Dispatch) je nízkoúrovňová technologie paralelního zpracování od Apple, postavená na C, ale s pohodlnými obaly v Swift a Objective-C. Poskytuje mechanismus pro správu front práce (work items) a jejich asynchronní nebo synchronní vykonávání na dostupných procesorových jádrech.

Hlavní koncepty GCD:

  1. Dispatch Queue: Fronty pro vykonávání úkolů. Existují dva typy:

    • Serial Queue: Úkoly jsou vykonávány postupně jeden po druhém. Zabraňuje závodním podmínkám při přístupu ke sdíleným zdrojům.
    • Concurrent Queue: Úkoly jsou vykonávány paralelně (ale pořadí jejich spuštění a ukončení není garantováno). Používají se pro vykonávání nezávislých úkolů, které mohou běžet současně.
    • Main Queue: Speciální sekvenční fronta spojená s hlavním vláknem aplikace. Používá se pro aktualizaci UI. Všechny úkoly související s UI musí být vykonány právě v této frontě.
  2. Work Items (Closures/Blocks): Bloky kódu představující samostatný úkol k vykonání.

  3. Dispatch Group: Umožňuje seskupit úkoly a získat oznámení, když jsou všechny dokončeny.

  4. Dispatch Semaphores: Primitiv pro synchronizaci řízení přístupu k omezenému počtu zdrojů.

Použití v iOS vývoji:

  • Vykonávání těžkých operací na pozadí: Přesun úkolů, jako jsou síťové požadavky, zpracování obrázků, práce s databázemi, z hlavní fronty na pozadí (například globální konkurenční fronty), aby se zabránilo zablokování UI.

    // Asynchronní vykonání úkolu v globální paralelní frontě
    DispatchQueue.global(qos: .userInitiated).async {
        // Těžká operace
        let result = performHeavyOperation()
    
        // Aktualizace UI na hlavním vlákně
        DispatchQueue.main.sync {
            updateUI(with: result)
        }
    }
    
  • Aktualizace UI: Vždy provádět operace změny uživatelského rozhraní na hlavní frontě.

    // Aktualizace UI na hlavním vlákně
    DispatchQueue.main.async {
        self.label.text = "Aktualizováno!"
    }
    
  • Serializace přístupu k datům: Použití vlastních sekvenčních front pro synchronizovaný přístup ke sdíleným měnitelným zdrojům.

    // Příklad sekvenční fronty pro synchronizovaný přístup
    let dataAccessQueue = DispatchQueue(label: "com.myapp.dataaccess")
    
    func updateSharedData(newValue: Int) {
        dataAccessQueue.async {
            // Bezpečná změna sdílených dat
            sharedData = newValue
        }
    }
    
  • Skupinové úkoly: Čekání na dokončení několika asynchronních úkolů před pokračováním.

    // Skupina úkolů
    let group = DispatchGroup()
    
    group.enter() // Začátek úkolu 1
    performAsyncOperation1 {
        print("Úkol 1 dokončen")
        group.leave()
    }
    
    group.enter() // Začátek úkolu 2
    performAsyncOperation2 {
        print("Úkol 2 dokončen")
        group.leave()
    }
    
    // Oznámení po dokončení všech úkolů ve skupině
    group.notify(queue: .main) {
        print("Všechny úkoly dokončeny, aktualizace UI")
        // Aktualizace UI
    }
    
  • Odložené vykonávání: Vykonání kódu po stanovené době.

    // Odložené vykonání po 2 sekundách
    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        print("Spuštěno po 2 sekundách")
    }
    

GCD poskytuje vyšší úroveň a efektivnější přístup k řízení vláken ve srovnání s tradičními vlákny (například Thread), delegujíc správu vláknového poolu systému a umožňujíc efektivní využití vícejádrových procesorů.