Sobes.tech
Middle

Co je Grand Central Dispatch a jak se používá v vývoji iOS?

sobes.tech AI

Odpověď od AI

Grand Central Dispatch (GCD) je nízkoúrovňové API pro správu více vláken, které poskytuje sadu systémových vláken a plánuje jejich vykonávání.

Hlavní koncepty GCD:

  • Dispatch Queue: Fronty, do kterých jsou umístěny bloky kódu (úkoly) k vykonání.
    • Sériové fronty: Vykonávají bloky v pořadí přidání, po jednom.
    • Paralelní fronty: Vykonávají bloky paralelně, ale v pořadí přidání.
  • Úkoly (Bloky): Jednotky práce, které jsou odesílány do dispatch front.
  • Dispatch Sources: Monitorování systémových událostí (soubory, sokety, signály), které volají vykonání bloků při jejich vzniku.

Použití:

  1. Vykonávání úloh na pozadí: Načítání dat ze sítě, zpracování obrázků, složité výpočty, aby hlavní vlákno (UI) nebylo blokováno.

    DispatchQueue.global(qos: .userInitiated).async {
        // Vykonání náročné operace
        let processedData = performHeavyProcessing()
    
        DispatchQueue.main.async {
            // Aktualizace UI na hlavním vlákně
            updateUI(with: processedData)
        }
    }
    
  2. Plánování úloh: Odložené vykonání nebo periodické vykonání.

    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        // Tento kód se vykoná za 2 sekundy
        print("Odložené vykonání")
    }
    
  3. Synchronizace přístupu k datům: Použití sériových front nebo DispatchQueue.concurrentPerform pro kontrolu paralelního přístupu.

    let syncQueue = DispatchQueue(label: "com.myapp.syncdatasource", attributes: .concurrent)
    var sharedArray = [Int]()
    
    func addItem(_ item: Int) {
        syncQueue.async(flags: .barrier) { // Použití .barrier pro exkluzivní přístup při zápisu
            sharedArray.append(item)
        }
    }
    
    func processItems() {
        syncQueue.sync { // Synchronous read
            for item in sharedArray {
                print(item)
            }
        }
    }
    

Výhody oproti ruční správě vláken (POSIX vlákna):

  • Jednodušší použití: Vyšší úroveň abstrakce.
  • Efektivita: GCD efektivněji spravuje sadu systémových vláken, snižuje režii.
  • Škálovatelnost: Automaticky se přizpůsobuje počtu jader procesoru.

Typy QoS (Kvalita služby): Určuje prioritu úkolu pro plánovač GCD.

QoS Použití
userInteractive Aktualizace UI, animace, rychlá reakce
userInitiated Úkoly iniciované uživatelem, vyžadující rychlé dokončení (stahování, zpracování fotografií)
default Výchozí priorita, mezi userInitiated a utility
utility Dlouhotrvající úkoly bez naléhavosti (stahování, indexování)
background Úkoly na pozadí, neviditelné uživateli (zálohování, synchronizace na pozadí)
unspecified Priorita není nastavena, určuje ji systém